我有使用自动实现的属性的简单类:
Public Class foo
{
public foo() { }
public string BarName {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我显然在我的类中使用变量BarName,现在需要在设置属性值时添加逻辑(它必须全部为大写,如图).这是否意味着我现在需要为BarName创建一个私有变量,例如_BarName,并将我的类中使用的当前BarName变量更改为_BarName?
Public Class foo
{
public foo() {}
private string _BarName = "";
public string BarName
{
get {return _BarName;}
set {_BarName = Value.ToString().ToUpper();}
}
}
Run Code Online (Sandbox Code Playgroud)
我正在努力确保我理解使用自动实现的属性的含义,以及当我/如果我需要更改某些内容时它会带来什么.我假设重构,如上所示,不是一个突破性的变化,因为该属性基本上保持不变; 它只是在课堂上做了一些工作,以保持这种方式并添加所需的逻辑.
另一个可能更有意义的例子是我需要在使用setter或getter时调用某个方法; 更多然后改变价值.
这似乎是设置属性的代码行和行的公平交易.
C#3.0的自动属性是否完全取代了归档?
我的意思是,我可以直接使用该属性而不是归档作为属性作为私人支持字段.(对不起,我只是这样理解).
int a;
public int A
{
get;set;
}
Run Code Online (Sandbox Code Playgroud) 我有一个用C++编写的大型库,有人创建了一个以自动方式在python(2.6)中使用它的接口.现在我有很多带有getter和setter方法的类.真的:我讨厌他们.
我想使用属性重新实现具有更多pythonic接口的类.问题是每个班级都有数百个getter和setter,而且我有很多课程.如何自动创建属性?
举例来说,如果我有一类叫做MyClass用GetX()和SetX(x),GetY,SetY,等...方法,我怎么能自动创建一个派生类MyPythonicClass与属性X(可读,如果有getter和可写的,如果有二传手)等上?我想要一种机制让我选择跳过一些getter/setter夫妇,最好是手工完成工作.
我想我们都同意C#3.0中的自动属性很棒.像这样的东西:
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
Run Code Online (Sandbox Code Playgroud)
减少到这个:
public string Name { get; set; }
Run Code Online (Sandbox Code Playgroud)
可爱!
但是,如果我想在"设置"时使用ToUpperInvariant()方法转换Name字符串,我应该怎么做.我是否需要恢复旧的C#2.0创建属性的风格?
private string name;
public string Name
{
get { return name; }
set { name = value.ToUpperInvariant(); }
}
Run Code Online (Sandbox Code Playgroud)
或者有更优雅的方式来实现这一目标吗?
允许这样做:
public int Age
{
get;
set;
}
Run Code Online (Sandbox Code Playgroud)
但应用程序是否为变量创建/分配空间?我经常这样做
private int age = 0;
public int Age
{
get { return this.age; }
set { this.age = value; }
}
Run Code Online (Sandbox Code Playgroud) 在这个例子中,Foo.Something和Bar.Something之间有什么有效的区别吗?
class Foo
{
public string Something;
}
class Bar
{
public string Something{get; set;}
}
class Program
{
static void Main(string[] args)
{
var MyFoo = new Foo();
MyFoo.Something = "Hello: foo";
System.Console.WriteLine(MyFoo.Something);
var MyBar = new Bar();
MyBar.Something = "Hello: bar";
System.Console.WriteLine(MyBar.Something);
System.Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
AFAIK他们的行为完全相同.如果他们为什么不在Foo中使用普通的字段?在java中,我们使用setter来强制执行新的不变量而不会破坏代码和getter来返回安全数据但是在c#中你总是可以将Foo重写为:
class Foo
{
private string _Something;
public string Something
{
get {
//logic
return _Something;
}
set {
//check new invariant
_Something = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
旧代码不会被破坏.
Reflector在自动属性中显示此信息:
public string AddressLine1
{
[CompilerGenerated]
get
{
return this.<AddressLine1>k__BackingField;
}
[CompilerGenerated]
set
{
this.<AddressLine1>k__BackingField = value;
}
}
Run Code Online (Sandbox Code Playgroud)
是否有任何加载项或其他工具将其转换为:
public string AddressLine1 { get; set; }
Run Code Online (Sandbox Code Playgroud)
我不相信这些加载项中的任何一个都支持上述内容:http://www.codeplex.com/reflectoraddins
如果你证明我错了,买就会很开心.
我已经编程了很长时间,很难跟上语言的变化...
在.net v2之后设置这样的属性真的没问题
public string LocaleName
{
get;
set;
}
Run Code Online (Sandbox Code Playgroud)
不需要内场?好像编译器最近会处理这个问题?
我正在开发一个ASP.NET项目,我在Visual Studio 2010中使用VB.NET.项目中的一些其他开发人员正在使用Visual Studio 2008.我们都将我们的代码检查到单个SVN存储库中.我想在VB.NET中开始使用Auto-Implemented Properties ...
Property FirstName as String
Run Code Online (Sandbox Code Playgroud)
代替 ...
Private FirstName as String
Public Property FirstName() As String
Get
Return _FirstName
End Get
Set(ByVal value As String)
_FirstName = value
End Set
End Property
Run Code Online (Sandbox Code Playgroud)
我担心的是,对于那些使用VS2008的人而言,这可能会让事情变得更糟.如果使用VS2008的人需要修改使用Auto-Implemented Properties的类,会发生什么?我假设因为一切都编译成IL代码,那么二进制兼容性就没有问题了.虽然编辑源时会出现问题.我是对的还是错的?谢谢.
vb.net automatic-properties visual-studio-2010 visual-studio-2008
编辑:不是一个完全不同的问题,这个我要问如何自动性质内部工作
当我制作一个自动财产时,后台会发生什么?
这相当于
public int SomeProperty {get; set;}
Run Code Online (Sandbox Code Playgroud)
这个
private int _someField;
public int SomeProperty
{
get { return _someField;}
set { _someField = value;}
}
Run Code Online (Sandbox Code Playgroud)
这是字面上发生的事情(即创建一个私有字段),还是只是为了解释事物,它的工作方式不同