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的编号