在开发博客,在线代码示例和(最近)甚至是一本书中,我一直在寻找像这样的代码:
var y = x as T;
y.SomeMethod();
Run Code Online (Sandbox Code Playgroud)
或者更糟糕的是:
(x as T).SomeMethod();
Run Code Online (Sandbox Code Playgroud)
这对我来说没有意义.如果你确定它x是类型T,你应该使用直接演员:(T)x.如果您不确定,可以使用as但需要null在执行某些操作之前进行检查.以上代码所做的就是将(有用)InvalidCastException变为(无用)NullReferenceException.
我是唯一一个认为这是公然滥用as关键字的人吗?还是我错过了一些明显的东西,上面的模式实际上有意义?
我刚刚修改了深度C#的第4章,它处理了可空类型,我正在添加一个关于使用"as"运算符的部分,它允许你编写:
object o = ...;
int? x = o as int?;
if (x.HasValue)
{
... // Use x.Value in here
}
Run Code Online (Sandbox Code Playgroud)
我认为这非常简洁,它可以提高性能而不是C#1等效,使用"is"后跟一个演员 - 毕竟,这样我们只需要请求动态类型检查一次,然后进行简单的值检查.
然而,情况似乎并非如此.我在下面包含了一个示例测试应用程序,它基本上对对象数组中的所有整数求和 - 但该数组包含许多空引用和字符串引用以及盒装整数.该基准测试您必须在C#1中使用的代码,使用"as"运算符的代码,以及用于踢LINQ解决方案的代码.令我惊讶的是,在这种情况下,C#1代码的速度提高了20倍 - 即使是LINQ代码(考虑到所涉及的迭代器,我预计它会更慢)也胜过"as"代码.
可以isinst为空的类型的.NET实现真的很慢吗?是unbox.any导致问题的附加因素吗?还有另一种解释吗?目前,我觉得我必须在性能敏感的情况下包含警告,禁止使用它...
结果:
演员:10000000:121
As:10000000:2211
LINQ:10000000:2143
码:
using System;
using System.Diagnostics;
using System.Linq;
class Test
{
const int Size = 30000000;
static void Main()
{
object[] values = new object[Size];
for (int i = 0; i < Size - 2; i += 3)
{
values[i] = null;
values[i+1] …Run Code Online (Sandbox Code Playgroud) Convert.ToString()和之间有什么区别.ToString()?
我在网上发现了很多不同之处,但主要区别是什么?
可能重复:
使用CLR中的'as'关键字进行转换
我最近了解了一种不同的演员方式.而不是使用
SomeClass someObject = (SomeClass) obj;
Run Code Online (Sandbox Code Playgroud)
可以使用以下语法:
SomeClass someObject = obj as SomeClass;
Run Code Online (Sandbox Code Playgroud)
如果obj不是SomeClass,它似乎返回null,而不是抛出一个类转换异常.
我看到如果转换失败并且我尝试访问someObject变量,这可能导致NullReferenceException.所以我想知道这种方法背后的理由是什么?为什么要使用这种方式而不是(旧)方式 - 它似乎只是将失败的演员问题"更深"地转移到代码中.
可能重复:
使用CLR中的'as'关键字进行转换
这两个演员之间究竟有什么区别?
SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;
Run Code Online (Sandbox Code Playgroud)
通常,它们都应该显式转换为指定的类型?
如果存在差异,则执行以下演员的两种方式之间有什么区别?
在这种情况下e是一个GridViewRowEventArgs对象.
GridView gv = (GridView)e.Row.FindControl("gv"); //first way
GridView gv2 = e.Row.FindControl("gv") as GridView; //second way
Run Code Online (Sandbox Code Playgroud) 我经常遇到处理DataRows退回的问题SqlDataAdapters.当我尝试使用如下代码填充对象时:
DataRow row = ds.Tables[0].Rows[0];
string value = (string)row;
Run Code Online (Sandbox Code Playgroud)
DBNull's在这种情况下处理这种情况的最佳方法是什么.
可能重复:
使用CLR中的'as'关键字进行转换
哪种方法被认为是最佳做法?
先投?
public string Describe(ICola cola)
{
var coke = cola as CocaCola;
if (coke != null)
{
string result;
// some unique coca-cola only code here.
return result;
}
var pepsi = cola as Pepsi;
if (pepsi != null)
{
string result;
// some unique pepsi only code here.
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
或者我应该先检查,然后再投?
public string Describe(ICola cola)
{
if (cola is CocaCola)
{
var coke = (CocaCola) cola;
string result;
// some unique coca-cola only code …Run Code Online (Sandbox Code Playgroud) 可能重复:
使用CLR中的'as'关键字进行转换
我在C#中看到了两种不同的方式.
例如:
MyObj foo = (MyObj) bar; // this is what I see most of the times
MyObj foo = bar as MyObj; // I do see this sometimes
Run Code Online (Sandbox Code Playgroud)
style 1和style 2铸造的专有名称?非常感谢您对此进行调查:)
我有一个类型列表List<JobSeeker>.我想将它存储在ViewState中.怎么做到这一点?
private List<JobSeeker> JobSeekersList { get; set; }
Run Code Online (Sandbox Code Playgroud)