【问题标题】:Understanding syntax in C#理解 C# 中的语法
【发布时间】:2010-04-23 13:06:59
【问题描述】:

我希望有人能帮助我理解下面的代码行中发生了什么:

Table t = (Table)Page.FindControl("Panel1").FindControl("tbl");

我明白Page.FindControl("Panel1").FindControl("tbl"); 为什么Page.FindControl前面有个(Table)?

【问题讨论】:

  • 一旦你找到了你的控件,你需要把它放在某个地方,对吧?
  • @Dan,那是那个语法中的“t”,而不是“Table”

标签: c# asp.net .net-3.5 findcontrol


【解决方案1】:

FindControl 被声明为返回Control(猜测:),而您需要将结果存储在Table 类型的变量中。

(Table) 位是一个 cast - 它基本上是在说,“我认为这将是一个 Table。在执行时为我检查它,然后让我相应地使用它。 "

【讨论】:

  • 您也可以通过将其写为 ... Table t = Page.FindControl("Panel1").FindControl("tbl") as Table; 来查看安全转换。所有这一切都是尝试强制转换,如果强制转换不成功,现在说它不再是表格而是文本框,它将使 t 为 null 并且不会引发异常。
  • @jeriley:是的,虽然我很少发现这很有用。通常,当我编写演员表时,这是因为如果它是任何其他类型,则表明存在错误 - 所以我希望抛出异常。
  • 我几乎从不在 C# 中使用直接强制转换。我发现var t = ctl as Table; if (t == null) return fail();Table t = null; try { t = (Table)ctl; } catch { return fail(); } 干净得多。
  • @Mark:你为什么会在第一个plcae中捕获异常?让它向上传播 - 它表示编程错误。您将如何从表明事情不符合您预期的事情中恢复过来?
  • 在我看来,C# 中的任何强制转换都是等待发生的异常。对我来说,它表明设计中的某些东西不是最理想的,可能应该在某个时候被排除在外。我唯一使用强制转换的时候是当我知道强制转换比替代方案更有效并且我可以让自己确信它永远不会引发异常时。
【解决方案2】:

Page.FindControl 返回一个Control 类型&,因此您需要将其转换为您需要使用的相关控件类型...

参考:http://msdn.microsoft.com/en-us/library/31hxzsdw.aspx

HTH。

旁注:

我希望我们能做到:

var t = Page.FindControl<Panel>("Panel1").FindControl<Table>("tbl"); 

也许通过一点扩展方法的魔法,我们可以得到:

public static class Extension{

  public static T FindControl<T>(this Control control, string id) 
   where T : Control{
       return control.FindControl(id) as T;
  }

}

【讨论】:

    【解决方案3】:

    【讨论】:

    • 谢谢,即。这有助于我更深入地了解“何时”和“为什么”;
    【解决方案4】:

    FindControl 返回Control 类型。

    代码中的表继承Control。通过将对象显式转换为其定义的类型,您可以访问该类型的所有属性,而不仅仅是从Control 继承的属性。

    【讨论】:

      猜你喜欢
      • 2013-11-11
      • 1970-01-01
      • 2018-01-27
      • 1970-01-01
      • 2012-08-21
      • 2013-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多