3
A
回答
9
6
要继续约翰的回答,而是执行此操作:
string username;
if (myDic.TryGetValue("username", out username))
{
user.Username = username;
}
3
你可以在VB中做到这一点,但不是C#。
VB将生成一个临时变量(在堆栈上),将其地址传递给out值,然后在方法调用后对该属性进行赋值。
一般来说VB是这样做的,因为它在整个地方都有很多隐含的东西。这只是它的工作方式。另一方面,C#往往避开隐含性作为其哲学的一部分。这就是为什么,例如,你必须向呼叫站点添加“out”,以便让参数起作用,并且为什么它不支持扩展方法的第一个参数的“ref”参数。
在呼叫站点使用显式的“out”语法可以在这里支持属性。但是,我相信他们不这样做的原因是因为VB使用的技巧对于属性的行为与对字段的行为不完全相同。使用字段时,分配会立即发生在方法内发生的地方。如果方法中有其他代码(通过调用对象的方法)读取该字段,它将读取通过输出参数分配的新字段值。
使用VB技巧的属性,该属性直到方法返回后才会被赋值。这意味着在out参数分配后直接读取属性的任何代码都会读取旧值。
这里是什么,我的意思是一个简单的例子:)
class C
{
private int m_bar;
public int Bar { get { return m_bar; } set { m_bar = value; }}
void foo(out int x)
{
x = 2;
Console.WriteLine(Bar);
}
void DoStuff()
{
foo(out m_bar); //outputs 2
Bar = 0;
//pretend this works
foo(out Bar); //outputs 0
Console.WriteLine(Bar); // outputs 2
}
}
内DoStuff(,你会得到不同的行为,为第一次调用foo的比你从第二个呼叫为foo会,虽然大多数人会期望他们以同样的方式行事。
通常C#试图避免这些类型的事情。
这是我的猜测,为什么他们不支持它(规范只是说不支持,它并不真正说为什么)。
相关问题
- 1. 将默认值分配给xsd属性
- 2. 将多个值分配给属性
- 3. 如何将属性分配给属性
- 4. 不能分配给该
- 5. 过滤器对象并将属性值分配给数组?
- 6. XamlParseException无法分配给属性。绑定不能使用附加属性
- 7. UICollectionViewCell不能将值分配给CustomCollectionViewCell
- 8. 将值分配给数组索引并将值分配给变量在java中的性能差异
- 9. 未能分配给属性'Windows.UI.Xaml.Controls.ContentControl.Content'
- 10. 属性分配给在飞行功能
- 11. 未能分配给属性'Microsoft.Phone.Controls.MenuItem.Click'
- 12. 未能分配给属性'Windows.UI.Xaml.Controls.ContentPresenter.Content'
- 13. 使用jQuery将属性分配给使用变量的链接
- 14. 将非基元值分配给用户控件属性?
- 15. Apache Ant的:从文件中读取值,并将其分配给属性的值
- 16. Javascript将rel属性分配给变量
- 17. 将函数分配给JSON属性
- 18. 将PFUser属性分配给UILabel
- 19. 将参数分配给属性Java
- 20. 将jquery var分配给模型属性
- 21. 将显示属性分配给变量
- 22. 将WritableBitmap分配给ImageBrush.ImageSource属性
- 23. 将保留对象分配给弱属性;对象将分配
- 24. 不能分配给属性:'b0'是一个只能得到的属性
- 25. 获取属性并分配功能
- 26. 协议扩展:不能分配给只能得到的属性
- 27. 不能分配给只读属性'原型'功能'类Template7
- 28. 分配给属性时XamlParseException
- 29. 错误:属性访问必须分配给属性或使用它的值
- 30. 属性访问必须分配给属性或使用它的值vb