在C#中,如果我声明一个自动实现的属性,为什么我必须声明get和set部分?
即
public string ThisWorks { get; set; }
public string ThisDoesnt { get; }
Run Code Online (Sandbox Code Playgroud)
这不仅仅是语法糖 - 即编译器为属性插入一个私有字段?那问题为什么呢?
好奇.
我正在尝试使用此代码编译POCO
public class MenuItem
{
public string Name
{ get; set; }
public string Url
{ get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我一直在使用以下消息获取编译错误:'MenuItem.Name.get'必须声明一个正文,因为它没有标记为abstract或extern.我错过了什么?我正在本地文件系统网站的App_Code文件夹中编译此类,该文件系统网站设置为编译为.NET 3.5.我知道我以前做过这个,但无法弄清楚我在做什么不同.
我知道自动属性必须定义一个get和set访问器方法,我也知道这些访问器中的任何一个都可以通过访问修饰符变得不可见.
是否存在编译器满意的技术原因
public object Property { get; set; }
Run Code Online (Sandbox Code Playgroud)
但不是
public object Property { get; }
Run Code Online (Sandbox Code Playgroud)
我对此代码的理解(可能是错误的)是编译器生成一个隐藏在调用代码中的支持字段,如下所示:
private object hiddenField; //hidden by compiler.
public object Property
{
get { return hiddenField; }
set { hiddenField = value;}
}
Run Code Online (Sandbox Code Playgroud)
如果编译器可以生成它,是否有理由不能根据属性声明中setter的存在(或缺少)来省略set accessor函数.
我知道这可能是一个功能范围而不是技术限制的问题,我也自由地承认我还没有咨询过C#语言规范.
[ 更新2 ]
原谅我......我是个白痴:P,我现在看到了,谢谢大家为我的高级时刻做好准备/
我建议我有一个接口并从中继承类,
internal interface IPersonInfo
{
String FirstName { get; set; }
String LastName { get; set; }
}
internal interface IRecruitmentInfo
{
DateTime RecruitmentDate { get; set; }
}
public abstract class Collaborator : IPersonInfo, IRecruitmentInfo
{
public DateTime RecruitmentDate
{
get;
set;
}
public String FirstName
{
get;
set;
}
public String LastName
{
get;
set;
}
public abstract Decimal Salary
{
get;
}
}
Run Code Online (Sandbox Code Playgroud)
那么如何验证协作者类中的字符串?是否可以实现内部属性?
我看了别人的代码,发现了这段代码
private string _deviceName { get; set; }
private string _deviceAlias { get; set; }
Run Code Online (Sandbox Code Playgroud)
我的想法是私有变量的那些自动属性是不必要的.我这么认为是对的吗?
如何使用C#3.0自动属性重写下面的代码?
private int _myValue;
public int MyProperty
{
get { return _myValue;}
set
{
if (value > 0)
{
_myValue = value;
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果不可能,有什么替代方案?
我想象的简单问题,但这些代码行之间有什么区别:
代码1
public int Temp { get; set; }
Run Code Online (Sandbox Code Playgroud)
和
代码2
private int temp;
public int Temp { get { return temp; } }
Run Code Online (Sandbox Code Playgroud)
我的理解是,根据代码1的自动属性将执行与代码2完全相同的功能?
我正在阅读Head First C#,我发现很难理解为什么它使用两种不同的方式做同样的事情?
我有以下3个课程:
public class BaseProperty1{
public string Property1 {get; set;}
}
public class ChildProperty1 : BaseProperty1 {
}
public abstract class Base{
public abstract BaseProperty1 bp1 {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试从Base派生以下类:
public class Child : Base{
public ChildProperty1 bp1 {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
但是我收到的错误是"set"和"get"方法没有实现.它只是我正在使用的语法或我的思维方式是错误的吗?
谢谢!
我是C#的新手,不知道它的语法.但我对其他语言(Java,C++)有所了解.我下载了GLWidget项目并尝试构建它.但是我在这些行上有一个错误CS0501(带{ get; set; }):
namespace Gtk
{
[ToolboxItem(true)]
public class GLWidget : DrawingArea, IDisposable
{
IGraphicsContext graphicsContext;
static int graphicsContextCount;
/// <summary>Use a single buffer versus a double buffer.</summary>
[Browsable(true)]
public bool SingleBuffer { get; set; }
/// <summary>Color Buffer Bits-Per-Pixel</summary>
public int ColorBPP { get; set; }
/// <summary>Accumulation Buffer Bits-Per-Pixel</summary>
public int AccumulatorBPP { get; set; }
/// <summary>Depth Buffer Bits-Per-Pixel</summary>
public int DepthBPP { get; set; }
/// <summary>Stencil Buffer Bits-Per-Pixel</summary>
public int …Run Code Online (Sandbox Code Playgroud) 我在ASP.NET Web应用程序的C#源文件中使用自动实现的属性语法:
public int IdUser { get; set; }
...
this.IdUser = 1;
Run Code Online (Sandbox Code Playgroud)
该项目的Target框架是.NET Framework 2.0.它编译并且似乎在仅安装了ASP.NET 2.0的IIS服务器上正常运行.我使用Visual Studio 2010进行开发和编译.
我理解这个语法是在.NET 3中提供的
.我错过了VS中的某个设置吗?我可以预期在IIS/ASP.NET 2.0服务器上部署网站时出现问题吗?
c# ×9
.net ×2
asp.net ×2
inheritance ×2
accessor ×1
c#-3.0 ×1
class ×1
field ×1
interface ×1
properties ×1
validation ×1