C# AS算子在C语言中的应用#
可能重复:C# AS算子在C语言中的应用#,c#,.net,C#,.net,可能重复: 这个操作员在哪里有用?而不是写这封信: Asset a = new Asset(); Stock s = a as Stock; // s is null; no exception thrown if (s != null) Console.WriteLine (s.SharesOwned); 你最好写些能抛掷的东西。我看到了很多 (s!=null) 在生产代码中,它真的变得丑陋。例外情况以这种方式更具描述性和自然性。甚至在概念上:如果资产不是股票,你怎么可能得不到
这个操作员在哪里有用?而不是写这封信:
Asset a = new Asset();
Stock s = a as Stock; // s is null; no exception thrown
if (s != null) Console.WriteLine (s.SharesOwned);
你最好写些能抛掷的东西。我看到了很多
(s!=null)
在生产代码中,它真的变得丑陋。例外情况以这种方式更具描述性和自然性。甚至在概念上:如果资产不是股票,你怎么可能得不到它?如果它不是股票,它应该是一个例外
你最好写些能抛掷的东西
不一定。用户不喜欢看到东西抛掷。您应该编写有效的代码。如果没有,你最好通过向用户道歉来妥善处理。as
运算符在以下情况下非常有用:例如,您将尝试强制转换,如果此强制转换不起作用,请为变量指定一个默认值,以便代码继续使用此默认值。这实际上取决于上下文
你最好写些能抛掷的东西
不一定。用户不喜欢看到东西抛掷。您应该编写有效的代码。如果没有,你最好通过向用户道歉来妥善处理。
as
运算符在以下情况下非常有用:例如,您将尝试强制转换,如果此强制转换不起作用,请为变量指定一个默认值,以便代码继续使用此默认值。这实际上取决于上下文。通常情况下,您不希望抛出异常,因为情况并不例外。您有一个frob
对象,您知道它可以是Foo
,也可以是条
。因此,只有当它是Foo
时,才需要执行某些操作
您尝试在设计中避免这些情况,而是使用虚拟方法。但是有时候没有什么好办法
因此,与其绕道而行
if (frob is Foo) {
((Foo) frob).Frobnicate();
}
你可以直接这样做:
var asFoo = frob as Foo;
if (asFoo != null) {
asFoo.Frobnicate();
}
如果没有其他问题,这至少更有效,因为您只需要测试一次类型相等性(在as
强制转换中),而不是两次(在is
和强制转换中)
作为一个具体的例子,当您想要清除表单中的所有输入框时,这非常有用。您可以使用以下代码:
foreach (Control c in this.Controls) {
var tb = c As TextBox;
if (tb != null)
tb.Clear();
}
在这里使用异常是没有意义的。通常情况下,您不希望抛出异常,因为情况并不例外。您有一个
frob
对象,您知道它可以是Foo
,也可以是条
。因此,只有当它是Foo
时,才需要执行某些操作
您尝试在设计中避免这些情况,而是使用虚拟方法。但是有时候没有什么好办法
因此,与其绕道而行
if (frob is Foo) {
((Foo) frob).Frobnicate();
}
你可以直接这样做:
var asFoo = frob as Foo;
if (asFoo != null) {
asFoo.Frobnicate();
}
如果没有其他问题,这至少更有效,因为您只需要测试一次类型相等性(在as
强制转换中),而不是两次(在is
和强制转换中)
作为一个具体的例子,当您想要清除表单中的所有输入框时,这非常有用。您可以使用以下代码:
foreach (Control c in this.Controls) {
var tb = c As TextBox;
if (tb != null)
tb.Clear();
}
在这里使用异常是没有意义的。如果
资产
是从股票
继承的,那么这应该没问题。这是我见过的唯一一种工作方式,尽管你也可以在接口的情况下使用它。如果资产
是从股票
继承的,那么这应该没问题。这是我见过的唯一一种工作方式,尽管你也可以在接口的情况下使用它。就像做的那样is
,如果is
返回false
则赋值null
听起来像首歌,但这是答案,我经常使用它,就像在ASP.NET的FindControl方法中:
Button myButton = e.item.FindControl("myControlId") as Button;
如果FindControl找到与按钮不同的内容,这种赋值不会崩溃或抛出,而是简单地赋值null。我非常喜欢这个…就像做是一样,如果是则返回false
赋值null
听起来像首歌,但这是答案,我经常使用它,就像在ASP.NET的FindControl方法中:
Button myButton = e.item.FindControl("myControlId") as Button;
如果FindControl找到与按钮不同的内容,这种赋值不会崩溃或抛出,而是简单地赋值null。我非常喜欢这个…是的,as
操作符很有用,是的,它可能被误用
如果确定某个变量x
的类型为T
,则应使用常规强制转换
T y = (T)x;
如果T1
和T2
都是变量x
的有效类型,则可以使用as
检查类型并在一次操作中执行强制转换。是的,as
运算符很有用,是的,它可能被误用
如果确定某个变量x
的类型为T
,则应使用常规强制转换
T y = (T)x;
如果T1
和T2
都是变量x
的有效类型,您可以使用as
检查类型并在一次操作中执行强制转换。您的要求是什么
如果资产是股票,打印拥有的股票数量
在这种情况下,as
运算符非常有用,但您必须检查stock!=空
。这是要求所暗示的
打印股票拥有的股份数。如果提供了其他资产,则为错误
然后您应该编写引发异常的代码。您的要求是什么
如果资产是股票,打印拥有的股票数量
在这种情况下,as
运算符非常有用,但您必须检查stock!=空
。这是要求所暗示的
打印shar的编号