我喜欢C#中自动实现的属性,但最近有这只大象站在我的小隔间里,我不知道该怎么办.
如果我使用自动实现的属性(以下称"aip"),那么我不再需要内部使用的私有支持字段.这很好,因为aip没有副作用.但是如果稍后我需要在get或set中添加一些额外的处理呢?
现在我需要创建一个支持字段,这样我就可以扩展我的getter和setter.这适用于使用该类的外部代码,因为它们不会注意到差异.但是现在所有对aip的内部引用都会在访问属性时调用这些副作用.现在,必须重构对ate aip的所有内部访问才能使用后备字段.
所以我的问题是,大多数人都做了什么?您是使用自动实现的属性还是更喜欢始终使用后备字段?您如何看待具有副作用的属性?
我正在检查.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)
如果我使用自动属性,名称的私有变量名称是什么?互联网上的教程说编译器会自动创建一个私有变量.那么我如何使用/访问私有变量,如果我想在这个类的方法中使用它?
看看新的VB 2010功能,我偶然发现了对Auto-Implemented Properties的支持.
由于我正在使用C#,这看起来很熟悉,但我注意到VB确实添加了我希望在C#中拥有的功能:为自动实现的属性设置任意默认值:
Public Class Person
Property Name As String = "Scott Guthrie"
Property Age as Integer = 35
End Class
Run Code Online (Sandbox Code Playgroud)
我真的很喜欢在C#中使用自动属性.这样可以节省我们每次只需要默认值时引入支持字段并将其挂接到属性的工作量,从而不必要地使代码混乱.
我想知道为什么这也不是在C#中引入的?不这样做的理由是什么?是否正在进行语法讨论,或者实现此方法是否存在技术限制?
为什么是这样:
public string Foo {get;set;}
Run Code Online (Sandbox Code Playgroud)
被认为比这更好:
public string Foo;
Run Code Online (Sandbox Code Playgroud)
我不能为我的生活而努力.任何人都能解释一下吗?
谢谢
我已经使用了很多自动属性但是我已经越来越远离那些使用构造函数中初始化的readonly支持字段设置类.我删除了所有的setter,只有在属性明显需要setter的情况下才添加.
我发现这使得我的课程更加健壮和优雅OO明智而且我正在踢我自己不早点这样做.
我发现构造函数在c#代码示例中一般都没有得到充分利用,我认为自动属性和对象初始化程序是其中的一个重要部分,所以我的问题是为什么c#团队推送这样的功能而不是更多地关注提供最佳功能的功能实践更多.一般来说,我认为编写糟糕的代码太容易了,并且相信可以帮助编码人员编写好的代码
我有一个属性:
public Dictionary<string, string> MyProp { get; set; }
Run Code Online (Sandbox Code Playgroud)
当我调用该属性来添加项时,我得到一个NullReferenceException.
我如何在属性本身进行空检查,如果它为null,它会给我一个新的?同时保持自动财产模式.
谢谢!
可能重复:
在C++中,为什么要new尽量少用?
在C++中分配的自动变量在哪里?在堆栈或堆上?
另外,我在7.9中读到- 堆栈和堆,堆栈上分配的所有内存在编译时都是已知的.这是真的吗?这是否意味着堆栈上只发生静态内存分配?
另外,请提及链接,参考C++中有关内存分配的完整说明文字.
有没有办法默认启用svn:keywords,这样每次添加新的源文件时都不需要为每个关键字启用此属性?
因此,使用全新的C#6,我们获得了那些整洁的自动属性初始化器.我想我也可以利用这些来制作比以往更简洁的单身人士.显然其他人也有这个想法.
public sealed class Singleton
{
public static Singleton Instance { get; } = new Singleton();
private Singleton() { /* some initialization code */ }
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
(它可能看起来与这个问题类似,但事实并非如此)