可能重复:
使用CLR中的'as'关键字进行转换
这两个演员之间究竟有什么区别?
SomeClass sc = (SomeClass)SomeObject;
SomeClass sc2 = SomeObject as SomeClass;
Run Code Online (Sandbox Code Playgroud)
通常,它们都应该显式转换为指定的类型?
键入铸造和检查哪种方法是最佳做法?
Employee e = o as Employee;
if(e != null)
{
//DO stuff
}
Run Code Online (Sandbox Code Playgroud)
要么
if(o is Employee)
{
Employee e = (Employee) o;
//DO stuff
}
Run Code Online (Sandbox Code Playgroud) AccountController.cs安排AccountController上课.Login该类的方法失败了.特别,
var result = await SignInManager.PasswordSignInAsync(
model.Email, model.Password, model.RememberMe, shouldLockout: true);
Run Code Online (Sandbox Code Playgroud)
在Login方法内投掷System.NullReferenceException.
我已经验证了model.Email,model.Password并且model.RememberMe不是空的.下一步是深入挖掘SignInManager,这是一个AccountController类型的对象ApplicationSignInManager.从上面一行调用的get访问器SignInManager是
public ApplicationSignInManager SignInManager
{
get
{
return _signInManager ??
HttpContext.GetOwinContext().Get<ApplicationSignInManager>();
}
// private set...
}
Run Code Online (Sandbox Code Playgroud)
我改写为
public ApplicationSignInManager SignInManager
{
get
{
var c = HttpContext.GetOwinContext();
var m = c.Get<ApplicationSignInManager>();
return _signInManager ?? m;
}
// private set...
}
Run Code Online (Sandbox Code Playgroud)
调试并确保get访问者没有返回 …
我已经在SO上看过很多很多这样的版本,但是它们似乎都不能满足我的需求.
我的数据来自供应商数据库,该数据库允许DateTime字段为null.首先,我将数据拉入DataTable.
using (SqlCommand cmd = new SqlCommand(sb.ToString(), conn))
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
da.Fill(dt);
}
Run Code Online (Sandbox Code Playgroud)
我正在将DataTable转换为List <>进行处理.
var equipment = from i in dt.AsEnumerable()
select new Equipment()
{
Id = i.Field<string>("ID"),
BeginDate = i.Field<DateTime>("BeginDate"),
EndDate = i.Field<DateTime>("EndDate"),
EstimatedLife = i.Field<double>("EstimatedLife")
}
Run Code Online (Sandbox Code Playgroud)
那么,在这个实例中如何检查DBNull?我试着写一个方法.
public DateTime CheckDBNull(object dateTime)
{
if (dateTime == DBNull.Value)
return DateTime.MinValue;
else
return (DateTime)dateTime;
}
Run Code Online (Sandbox Code Playgroud) 普通类型转换和使用"AS"关键字有什么区别?
我已经遇到过这种情况并且感到困惑.
Cat c = new Cat("Fluffy");
return (Animal)c;
Cat c = new Cat("Fluffy");
return c as Animal;
Run Code Online (Sandbox Code Playgroud)
这两种语法都存在的原因是什么?
object myObject = "Hello world.";
var myString = myObject as string;
Run Code Online (Sandbox Code Playgroud)
object myObject = "Hello world.";
var myString = (string)myObject;
Run Code Online (Sandbox Code Playgroud)
我已经看到两种方式都进行了类型转换.有什么不同?
这可能是一个微不足道的问题,我已经看到了Cast的几种不同变体.
示例一:
command.ExecuteScalar() as string;
Run Code Online (Sandbox Code Playgroud)
示例二:
(string)command.ExecuteScalar();
Run Code Online (Sandbox Code Playgroud)
两者都会产生ExecuteScalar()不同的影响,所以问题是与数据库交互时是否比另一个更理想?
在C#中,有一个is运算符用于检查对象是否与某种类型兼容.此运算符尝试将对象转换为某种类型,如果转换成功则返回true(或者false如果转换失败).
来自Jeffrey Richter CLR via C#:
is运算符检查对象是否与给定类型兼容,并且评估结果为布尔值:true或false.
if (o is Employee)
{
Employee e = (Employee) o;
// Use e within the remainder of the 'if' statement.
}
Run Code Online (Sandbox Code Playgroud)
在此代码中,CLR实际上是两次检查对象的类型:is运算符首先检查o是否与Employee类型兼容.如果是,则在if语句中,CLR再次验证o在执行强制转换时o引用Employee.CLR的类型检查提高了安全性,但肯定会带来性能成本,因为CLR必须确定变量(o)引用的对象的实际类型,然后CLR必须遍历继承层次结构,检查每个基类型针对指定的类型(Employee).
另外,从同一本书:
Employee e = o as Employee;
if (e != null)
{
// Use e within the 'if' statement.
}
Run Code Online (Sandbox Code Playgroud)
在此代码中,CLR检查o是否与Employee类型兼容,如果是,则返回对同一对象的非null引用.如果o与Employee类型不兼容,则as运算符返回null.请注意,as运算符使CLR只验证对象的类型一次.if语句只检查e是否为null; 可以比验证对象的类型更快地执行此检查.
所以,我的问题是:为什么我们需要is运营商?当is操作员更优选的情况下是哪种情况as.