鉴于这是一个非常自然的用例(如果你不知道as实际上是什么),
if (x is Bar) {
Bar y = x as Bar;
something();
}
Run Code Online (Sandbox Code Playgroud)
实际上是等效的(也就是说,编译器生成的CIL来自上面的代码将是等价的):
Bar y = x as Bar;
if (y != null) {
y = x as Bar; //The conversion is done twice!
something();
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我想我没有说清楚我的问题.我不会写第二个片段,因为它当然是多余的.我声称在编译第一个片段时编译器生成的CIL等同于第二个片段,这是多余的.问题:a)这是正确的吗?b)如果是这样,为什么这样is实施?
这是因为我发现第一个片段比实际写得更好更清晰,更漂亮
Bar y = x as Bar;
if (y != null) {
something();
}
Run Code Online (Sandbox Code Playgroud)
结论:
优化is/ ascase不是编译器的责任,而是JIT的责任.
此外,与空检查它具有比这两个方案(较少(更便宜)的说明is和as和is和cast).
附录:
与nullcheck一样的CIL(.NET 3.5):
L_0001: ldarg.1 …Run Code Online (Sandbox Code Playgroud) 我们知道C#提供了一个AS关键字,它自动检查Object是否属于某个类型,如果是,则将其转换为所需类型,否则返回null.
public class User
{
}
....
Object obj = someObj;
User user = obj As User;
...
在上面的示例中,An Object obj可以是User类型或其他类型.用户将获得User类型的对象或null.这是因为C#的As关键字首先执行检查,如果可能,然后执行将对象转换为结果类型.
那么Java中的任何关键字是否等同于C#的AS关键字?
好像我不明白 - 蟒蛇with声明.
考虑这个课程:
class test(object):
def __enter__(self): pass
def __exit__(self, *ignored): pass
Run Code Online (Sandbox Code Playgroud)
现在,当使用它时with,就像在
with test() as michael:
print repr(michael)
Run Code Online (Sandbox Code Playgroud)
我希望有一些输出像<test instance at memore blah>.但是我没有.
这里有什么问题吗?任何建议都会有帮助.
(我使用的是Python 2.6.6.)
编辑:
感谢
ephement指向我的文档.该__enter__方法应阅读
def __enter__(self): return self
Run Code Online (Sandbox Code Playgroud) 我发现使用以下内容:
TreeViewItem i = sender as TreeViewItem;
if(i != null){ ... }
Run Code Online (Sandbox Code Playgroud)
比以下更容易编写和理解:
if(sender.GetType() == typeof(TreeViewItem)){
TreeViewItem i = (TreeViewItem)sender;
...
}
Run Code Online (Sandbox Code Playgroud)
有没有令人信服的理由不使用第一个结构?
这可能是重复的,但"作为"是INCREDABLY很难关键字谷歌,即便如此无视"为"作为查询的一部分.
所以我想知道如何实现一个反复支持"as"的类.对于示例类:
class X {
private val
public X(def v) {
val=v
}
public asType(Class c) {
if (c == Integer.class)
return val as Integer
if(c == String.class)
return val as String
}
}
这允许类似于:
new X(3) as String
Run Code Online (Sandbox Code Playgroud)
工作,但没有帮助:
3 as X
Run Code Online (Sandbox Code Playgroud)
我大概有附加/修改"asType"关于字符串和整数不知怎么的,但我觉得像这样的任何更改,应仅限于"X"级...的X类或者可以实现类似的方法:
X fromObject(object)
Run Code Online (Sandbox Code Playgroud)
或以某种方式从X中修改字符串/ Integer类这似乎艰难的,因为直到X实际上是用它不会在X执行任何代码......如果我的X第一次使用是"3为X",将X GET在Groovy尝试调用之前有机会覆盖Integer的asType吗?
我正在使用派生类并使用as关键字将基类强制转换为它.当我这样做时,正在调用派生类构造函数,并且它的对象已初始化,但派生实例不会以初始化对象结束(具有空值).这是一个代码示例.
// classes
public class Request
{
public Request();
public Header Header{get;set;}
}
public class CreateRequest : Request
{
public Foo Foo{get;set;}
public Bar Bar{get;set;}
public CreateRequest():base()
{
this.Foo = new Foo();
this.Bar = new Bar();
}
}
public class SomeClass
{
private Response ProcessCreateRequest(Request request)
{
// request comes from a json request
CreateRequest createRequest = request as CreateRequest;
// values of Foo and Bar are null
[...]
}
}
Run Code Online (Sandbox Code Playgroud)
是"as"通常用于派生 - >基础而不是基础 - >派生的问题还是在这里有其他工作吗?