C#语言是什么:C#中的自动属性是什么它们的用途是什么

有人可以提供一个非常简单的解释自动属性在 C # 中,他们的目的,也许一些例子?

99

当属性访问器中不需要其他逻辑时,将使用自动属性。
声明如下所示:

public int SomeProperty { get; set; }

它们只是语法糖,所以你不需要编写以下更冗长的代码:

 private int _someField;
 public int SomeProperty 
 {
    get { return _someField;}
    set { _someField = value;}
 }
46

编辑:扩展一点,这些用于使在类中具有私有变量变得更容易,但允许它们在类外部可见(而不能够修改它们)

哦,自动属性的另一个优点是您可以在接口中使用它们!(不允许任何类型的成员变量)

使用正常属性,您可以执行以下操作:

private string example;
public string Example 
{
    get { return example; }
    set { example = value; }
}

自动属性允许您创建一些非常简洁的东西:

public string Example { get; set; }

所以,如果你想创建一个字段,它只能在类中设置,你可以这样做:

public string Example { get; private set; }

这相当于:

private string example;
public string Example 
{
    get { return example; }
    private set { example = value; }
}

或在 Java 中:

private String example;
public String getExample() {
    return example;
}
private void setExample(String value) {
    example = value;
}

编辑:@ Paya 还提醒我:

http://msdn.microsoft.com/en-us/library/bb384054.aspx http://weblogs.asp.net/dwahlin/archive/2007/12/04/c-3-0-features-automatic-properties.aspx
19

如果你问为什么要使用属性或自动属性,这是它背后的设计理念。

一个重要的设计原则是,您从不将字段公开为公共字段,而是始终通过属性访问所有内容。这是因为您永远无法确定何时访问字段,更重要的是何时设置字段。现在,很多时候,在设置或获取值时(例如,范围检查)都不需要任何处理。这就是创建自动属性的原因。它们是由编译器创建的一种简单的单行方式。

虽然这是我所做的,甚至为我的内部程序,它可能是更重要的设计用于公共使用(销售,开源等),如果你使用一个自动属性,后来决定,你需要做的东西在setget,你可以很容易地改变你的 code 不公共接口。

Update

作为对注释的澄清,如果所有代码都是您自己的,那么不,它可能不会对您的属性和字段产生太大影响。但是,如果您正在设计一个将被其他人使用的库,那么在公共字段和属性之间来回切换将导致异常,除非首先重新编译使用该库的代码。

作为测试,我创建了一个库项目,并声明了一个名为TestData的属性。我创建了一个全新的项目,只是为了使用这个库。所有工作都按预期进行。然后,我将属性更改为公共字段(名称保持不变),并在不重新编译使用项目的情况下复制新的库 DLL。结果是抛出异常,因为代码期望找到方法属性方法get_TestData

Unhandled Exception: System.MissingMethodException: Method not found: 'Void TestLibrary.TesterClass.set_TestData(System.String)'.
   at TestLibraryConsumer.Program.Main(String[] args)
4

许多人已经说过 auto 属性是语法糖-一种编写简单属性的速记方式。我将处理公共变量和公共属性之间的差异,以及为什么在两者之间切换时需要重新编译。采取以下措施:

public class MyClass
{
    public int MyPublicVariable = 0;
    public int MyPublicProperty
    {
        get;
        set;
    }
}

一旦编译,概念上,它实际上结束了类似于以下内容:

public class MyClass
{
    public int MyPublicVariable = 0;
    private int MyPublicProperty = 0;
    public int get_MyPublicProperty()
    {
        return MyPublicProperty;
    }
    public void set_MyPublicProperty( int value )
    {
        MyPublicProperty = value;
    }
}

很久以前,属性被发明为定义 get 和 set 方法对的一种快速简便的方法。它使代码更易读,更容易理解,因为它们传达了意图并确保了一致性。

MyClass myClass = new MyClass();
myClass.MyPublicVariable = 2;
myClass.MyPublicProperty = 2;

一旦编译,再次概念上,它最终类似于以下内容:

MyClass myClass = new MyClass();
myClass.MyPublicVariable = 2;
myClass.set_MyPublicProperty( 2 );

这也是 auto 属性被发明的原因-在保持最佳实践的同时加快代码编写速度。

还有一些关于接口的评论。接口本质上是一个契约,保证在实现它们的任何类中存在某些方法。从上面我们知道,属性表示一个或两个方法,所以它们在接口中工作得很好。

希望这有助于一点。

这是另一个可能感兴趣的例子:

public class MyClass
{
    private int[] _myArray = new int[ 5 ];
    public int MyArray[ int index ]
    {
        get
        {
            return _myArray[ index ];
        }
        set
        {
            _myArray[ index ] = value;
        }
     }
}
public class MyClass
{
    private int[] _myArray = new int[ 5 ];
    public int get_MyArray( int index )
    {
        return _myArray[ index ];
    }
    public void set_MyArray( int index, int value )
    {
        _myArray[ index ] = value;
    }
}

请注意:我不能完全记住反编译属性时使用的方法签名。我认为它是 'get_XXX' 和 'set_XXX' 但它可能是非常相似的其他东西。只要理解在那里,它可能不会太重要。最后,它们都变成了内存地址反正:-)

本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处

(670)
Op polo go:allocs/op和B/op在go基准测试中是什么意思
上一篇
各种披肩的样式和编织方法:删除本地 Git更改的各种方法(git force discard all local changes
下一篇

相关推荐

  • java和c#哪个好哪个更适合你?

    这个问题的答案取决于你要使用它们来做什么。Java和C都是流行的编程语言,它们都有自己的优点和缺点。Java是一种面向对象的编程语言,它有良好的可移植性,可以在多种平台上运行,而且具有高度的安全性。Java的编程模型非常简单,因此它很容易学习。Java编写的应用程序也可以在多种不同的设备上运行,例如智能手机、平板电脑和桌面计算机。…

    2023-01-30 05:09:27
    0 56 98
  • cshtml教程:C# Razor 语法教程

    示例示例cshtml教程cshtml是一种基于Razor语法的ASP.NET视图引擎,用于创建动态Web页面。它使用C#或Visual Basic代码和HTML标记来构建Web应用程序的用户界面。…

    2023-02-10 06:49:58
    0 36 33
  • java和c#区别:Java与C#的异同点比较

    示例示例Java和C#是两种非常流行的编程语言,它们之间有许多相似之处,但也有一些明显的差异。语法:Java语法更接近C++,而C#更接近C语言。…

    2023-08-28 15:35:48
    0 52 93
  • C语言的开发环境:创建C#Winform开发和生产环境

    关于C语言的开发环境的问题,在winform development中经常遇到,我想知道为我的 C # winforms 项目正确创建开发和生产环境的最佳方法是什么。不幸的是没有开发环境。相反,每次我希望创建 Production 或 Development 构建时,我必须指定发布路径。此外,由于每个 prod 或 dev 构建使用不同的连接字符串,因此我必须进入代码并进行更改。…

    2023-12-29 06:38:01
    0 93 28
  • C语言学习进阶:如何用 c#语言做一个棒球跑者进阶的代码(需要帮助)

    关于C语言学习进阶的问题,在learn to code with baseball中经常遇到,我试图在 Unity 中创建一个基于短信的棒球应用程序。我想要一个 C # unity 函数在我的小编码中正在这样做。我有 2 个可变的击球手和跑步者。我希望他们根据我给击球手和跑步者的变量来运行。所以我也有 1 号到 9 号棒球运动员一个接一个地来到盘子。…

    2024-02-08 12:47:37
    0 17 98
  • C#要学多久:C#-为什么要实现标准异常构造函数

    关于C#要学多久的问题,在standard constructors中经常遇到,从 MSDN,代码分析警告 CA1032:…

    2024-01-07 15:05:06
    0 31 49
  • C#保存文件:无法使用 C#保存Excel文件

    关于C#保存文件的问题,在why can't i save excel中经常遇到,我正在尝试在 Excel 中修改和保存数据。使用下面的代码,我正在访问工作表,执行修改,然后保存文件。我无法保存文件。这是我的代码:…

    2023-10-25 05:47:58
    0 30 57
  • Unity3d为什么用c#:Unity3d中的 c# 方法重写

    关于Unity3d为什么用c#的问题,在unity override function中经常遇到,在最近几周,我使用 c # 作为脚本语言与 Unity3d 一起玩。我以前从未使用过 c # 或 Unity3d,并且我试图了解方法重写如何在 Unity 框架中工作。令我惊讶的是,我可以扩展基类MonoBehavior并覆盖诸如Start (),Update ()等方法,而不必使用3…

    2024-01-19 01:28:26
    0 93 90

发表评论

登录 后才能评论

评论列表(50条)