2012-08-14 20 views
3

的自动选项设置/获取值今天我发现VS提供了一种自动方式来定义settersgetters。为了让晶莹剔透我有一个简单的类Students如何使用VS

class Students 
    { 
     private string name; 
     private Int32 pin; 
     private string addres; 
     private int phone; 
    ... 

当我选择name并单击CTRL + ķX然后选择C#然后propg我得到:

class Students 
    { 
     private string public int MyProperty { get; private set; } 
     private Int32 pin; 
     private string addres; 
     private int phone; 

这样的代码显然有问题,所以我最终得到:

class Students 
    { 
     private string name { get; private set; } 
     private Int32 pin; 
     private string addres; 
     private int phone; 

我的问题是 - 这是正确的方式来获得优势的VS自动化getterssetters?什么是正确的语法来设置和获取name的价值?如果这段代码是正确的,那么使用VS创建我的getterssetters而不是我发现的那个更优雅吗?

+2

在决定正确的用法(私人领域,私有财产,公共财产等)之前,您首先需要定义如何使用该值本身。以你班上的'name'为例。它是否需要在课堂外可见?它是否需要在课堂外进行设置?有没有业务逻辑来获取/设置它?它是如何使用的? – David 2012-08-14 15:05:13

+1

请注意,自动属性是C#固有的,而不是Visual Studio的概念。它恰好提供了一个用于生成它们的功能。 – Adam 2012-08-14 15:05:24

+4

一些随机提示:1)C#的命名约定表明大写属性,所以你会使用'Name'而不是'name'。 2)你不需要指定'private'两次。只需要在setter上指定,否则如果获得的是“public”或“protected”等。3)为什么你的类名称是复数形式的?班级的数据成员建议一个学生,但班级被称为“学生”。这看起来很不直观。 – David 2012-08-14 15:07:03

回答

3

自动属性背后的想法是完全删除私有字段,并将其替换为自动属性(具有隐藏的后台字段)。

还有一个代码片段

prop (TAB TAB) 

这就是说,你应该考虑GET/setter方法公开,和通常的惯例是PascalCase属性名称,即。

class Students 
{ 
    public string Name { get; set; } 
    public Int32 Pin { get; set; } 
    public string Address { get; set; } 
    public int Phone { get; set; } 
    ... 

编辑 按Servy的评论,还有向***像DTO的immutable数据为中心的课程越来越多的运动。这将导致setter私有化,并为该类提供初始化构造函数和/或类工厂方法。但是,这是后话,以后:)

+1

谢谢,很多有用的信息 – Leron 2012-08-14 15:11:51

+1

拥有私人定制者很常见。我不会劝阻人们使用它们。我经常很清楚它们是否应该公开设置。 – Servy 2012-08-14 15:57:15

4

不,不是。你需要的是重构从字段到自动属性,而不是新属性

4

您可以键入 “托”,按TAB键两次,Visual Studio将添加:

public TYPE Type { get; set; } 

然后更改 “类型” 和 “类型”

public string Name { get; set; } 

这对最快捷径在Visual Studio中创建属性。

编辑:此外,正如Serg提到的你可以去Refactor - >Encapsulate Field菜单选项将您的字段转换为属性。

7

将光标放在你的私有变量声明,并按下ctrl-Rctrl-E

+0

谢谢,使用这些快捷方式真的很容易,但由于shrot语法,我认为我会使用'prop(TAB TAB)',但是真正有用的shrotcuts。谢谢。 – Leron 2012-08-14 15:14:48

2

你得到的语法是正确的?如果你想要一个私人的getter/setter与automatic backing field

Ctrl +r,e将封装你的领域在一个属性,这意味着它会自动生成一个public属性与获取/设置为您的private字段。对于〔实施例:

与基类开始:

class Students 
{ 
    private string name; 
    private Int32 pin; 
    private string addres; 
    private int phone; 

选择名称,然后单击ctrl +r,e然后键入要使用你的新属性(我使用的建议“名称”),然后回车。您应该得到以下输出:

class Students 
{ 
    private string name; 

    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 
    private Int32 pin; 
    private string addres; 
    private int phone;