我正在检查.NET 3.5的新功能,发现在C#3.0中,我们可以使用
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
代替
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
Run Code Online (Sandbox Code Playgroud)
如果我使用自动属性,名称的私有变量名称是什么?互联网上的教程说编译器会自动创建一个私有变量.那么我如何使用/访问私有变量,如果我想在这个类的方法中使用它?
我有一个属性:
public Dictionary<string, string> MyProp { get; set; }
Run Code Online (Sandbox Code Playgroud)
当我调用该属性来添加项时,我得到一个NullReferenceException.
我如何在属性本身进行空检查,如果它为null,它会给我一个新的?同时保持自动财产模式.
谢谢!
可能重复:
在C++中,为什么要new尽量少用?
在C++中分配的自动变量在哪里?在堆栈或堆上?
另外,我在7.9中读到- 堆栈和堆,堆栈上分配的所有内存在编译时都是已知的.这是真的吗?这是否意味着堆栈上只发生静态内存分配?
另外,请提及链接,参考C++中有关内存分配的完整说明文字.
因此,使用全新的C#6,我们获得了那些整洁的自动属性初始化器.我想我也可以利用这些来制作比以往更简洁的单身人士.显然其他人也有这个想法.
public sealed class Singleton
{
public static Singleton Instance { get; } = new Singleton();
private Singleton() { /* some initialization code */ }
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
(它可能看起来与这个问题类似,但事实并非如此)
在C#中,您可以以比其他语言更简单的方式创建getter/setter:
public int FooBar { get; set; }
Run Code Online (Sandbox Code Playgroud)
这将创建一个内部私有变量,您无法直接使用外部属性"FooBar"直接访问它.
我的问题是 - 你多久经常看到这种滥用?它似乎很有可能经常违反封装最佳实践.不要误解我的意思,我会酌情使用它,并为只读的只写类型的属性使用它的部分变体,但是你的代码库中的其他作者对它的不愉快经历是什么?
澄清:当私人变量合适时,滥用的预期定义确实会产生这样的属性.
自从我发现汽车房产以来,我试着到处使用它们.以前我会在课堂上使用的每个属性都会有一个私人成员.现在这被auto属性所取代.我通常使用普通成员字段的方式在我的类中使用该属性.问题是该属性以国会大厦开始,这使得在以这种方式使用它时看起来有点奇怪.我之前并不介意属性从国会大厦开始,因为它们总是落后于"点".现在我发现自己在内部添加了我内部使用的所有属性this.,以此来抚慰我的感觉.
我的困境是,在我总是有点反对使用内部成员的所有用法前缀this.,除非"必要"(如在setter或构造函数中).所以我有点想找到第二个意见.有没有一个标准的好方法来做到这一点?我应该停止抱怨(我倾向于成为"蚂蚁驼背"(荷兰语表达))?
之前:
class Foo
{
private Bar bar;
public Bar Bar { get { return bar; } }
public Foo(Bar bar)
{
this.bar = bar;
}
public void DoStuff()
{
if(bar != null)
{
bar.DoMethod();
}
}
}
Run Code Online (Sandbox Code Playgroud)
后:
class Foo
{
public Bar Bar {get; private set;}
public Foo(Bar bar)
{
this.Bar = bar;
// or
Bar = bar;
}
public void DoStuff()
{
if(this.Bar != null)
{
this.Bar.DoMethod();
}
// or
if(Bar != …Run Code Online (Sandbox Code Playgroud) 在C#中,我可以拥有一个属性而无需声明私有变量.我的VB6代码看起来像这样
'local variable(s) to hold property value(s)
Private mvarPhoneNumber As String 'local copy
Public Property Let PhoneNumber(ByVal vData As String)
'used when assigning a value to the property, on the left side of an assignment.
'Syntax: X.PhoneNumber = 5
mvarPhoneNumber = vData
End Property
Public Property Get PhoneNumber() As String
'used when retrieving value of a property, on the right side of an assignment.
'Syntax: Debug.Print X.PhoneNumber
PhoneNumber = mvarPhoneNumber
End Property
Run Code Online (Sandbox Code Playgroud)
现在看起来像这样.
public string PhoneNumber{get;set;}
Run Code Online (Sandbox Code Playgroud)
如何在C#中的getter和setter方法中进行验证?我尝试添加这样的验证.
public string PhoneNumber …Run Code Online (Sandbox Code Playgroud) 在C#6.0中,新语法允许我们使用初始化程序编写只读自动属性:
public bool AllowsDuplicates { get; } = true;
Run Code Online (Sandbox Code Playgroud)
同样,我们可以使用表达式body getter来编写它:
public bool AllowsDuplicates => true;
Run Code Online (Sandbox Code Playgroud)
对于简单类型,这两个应该具有相同的效果:返回true的只读自动属性.
但是他们中的一个比另一个更受欢迎吗?我怀疑前者使用了支持字段:
private readonly bool _backingField = true;
public bool AllowsDuplicates {
get {
return _backingField;
}
}
Run Code Online (Sandbox Code Playgroud)
而后者变成了类似的东西:
public bool AllowsDuplicates {
get {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
这是正确的,还是编译器比这更聪明?
我想知道是否有任何方法可以为auto属性get/set方法添加自定义行为.
我能想到的一个明显的例子是希望每个set属性方法都PropertyChanged作为System.ComponentModel.INotifyPropertyChanged实现的一部分调用任何事件处理程序.这将允许类具有可以观察到的众多属性,其中每个属性都使用自动属性语法定义.
基本上我想知道是否有任何类似于get/set模板或post类/范围的get/set钩子.
(我知道可以通过稍微冗长的方式轻松实现相同的最终功能 - 我只是讨厌重复模式)
对于C#,我讨厌写出变量然后写出所有属性.没有办法选择所有变量,右键单击并创建所有属性.