C# 属性:私有方法还是私有get/set?

C# 属性:私有方法还是私有get/set?,c#,.net,properties,C#,.net,Properties,如果我想在一个私有类中设置我的属性,那么应该只能在这个类中使用和设置这个属性,有什么更好的方法?这个 public string Name { private get; private set } 或 嗯,还有 private string Name { private get; private set } 更好的方法取决于您想要什么: public string Name{private get;private set}该属性是public,但除了类本身之外,没有人可以读取或写入它。这是完

如果我想在一个私有类中设置我的属性,那么应该只能在这个类中使用和设置这个属性,有什么更好的方法?这个

public string Name { private get; private set }

嗯,还有

private string Name { private get; private set }

更好的方法取决于您想要什么:


public string Name{private get;private set}
该属性是
public
,但除了类本身之外,没有人可以读取或写入它。这是完全没有用的,所以只需使用
私有字符串名称{get;set}

通常,如果您像查看两个方法一样查看属性(实际上是)

我希望,有可能将该标识符应用于属性
get/set
的原因变得显而易见

public string Name { get; private set; }
这就是我认为你想要做的

当属性是公共的时,尝试使其私有化是没有意义的,除非您只想让您的类看到它。在这种情况下,您应该使用:

private string Name { get; set; }

更新:再读一遍,你肯定想要第二个例子。

你试过编译你的例子吗?只有中间的那个会翻译

如果要指定额外的可访问性级别关键字,则只能在其中一个访问器(getter/setter)上指定,并且该访问器的级别必须比整个属性的可访问性更严格


这里您可以看到规则:

值得注意的是,C#最初不允许您在getter或setter上设置不同的访问,因此唯一可能的选择是:

public string Name { get; set; }
protected internal string Name { get; set; }
internal string Name { get; set; }
protected string Name { get; set; }
private string Name { get; set; }
(就此而言,您不可能拥有自动属性,并且始终必须自己编写与支持字段之间的数据,但我们将忽略这一点,因为这样我们将有更短的示例)

对这两个对象有不同的访问通常是有用的,通常是比getter更严格的setter,等等

public string Name { get; private set; }
介绍

现在,通过扩展,它似乎足够合乎逻辑地允许:

public string Name { private get; private set; }
private string Name { private get; private set; }
然而,这两种表达是什么

第二个不是很糟糕,只是不必要的重复。尽管如此,很可能是一些混乱的想法让我们达到了目的(很可能是不完整的重构)。好的代码既要表达你正在做的事情,也要让计算机做一些事情(如果有的话,更重要的是),最好让它清楚地表达出来

因此,如果你最终得到了像
{private get;private set;}
这样的结果,那么它可能值得再看一次,并思考一下你真正想在这里说什么。这是一个编译器错误,万岁


第一种情况更糟。它说“这个属性是公共的,除了setter是私有的,getter是私有的”。这也不例外,“这是件事,除了所有的时间”并不是什么真正的表达。编译器不允许我们这样做,这让我们倍感欣慰。

对于私有成员,您不需要定义访问器。 只要这样做:

private string _name;

好像你想要

private string name;

public string Name

{

    get { return name; }

    set { name = value; }

}

这将允许您访问
私有字符串名称

是否要将属性设置为类的私有变量?@kundansinghchoushan是的,我想是的。。。我不确定我是否得到了你想要的^^@Sila我已经添加了我的答案。看一看。请先试着编译。在第一个问题是哪一个是“可编译的”之后,会出现关于哪一个更好的问题后的code>。但即使如此,只有第二个是合法的(见我的答案)。是的,你是对的。不知何故,如果使用private get,我就无法编译;仅当我将private用于get或for时才使用private setset@silla这是因为您使用一个访问修饰符设置属性,而使用不同的访问修饰符设置所有可能的访问器。使用get和set private将其设置为public会否定public部分,因此它不会编译。如果您将其设置为private,那么get和set将自动成为private,因此无需设置它们……只是为了学究:在不指定对getter或setter的不同访问权限的情况下,还有第五种可能性:
受保护的内部字符串名{get;set;}
@JeppeStigNielsen Yep。我有一半的想法认为,
受保护的内部
不在C#1.0中,后来才出现,但快速搜索似乎表明它一直在那里。
内部
现在意外地成为了
私有
@JeppeStigNielsen lol。有时候,人们应该保持安静。读得好,尽管对于新手来说,告诉他们最明显的用法可能很方便:公共字符串名称{get;private set}仅仅意味着类可以读取这个属性,但是类本身设置了它。可能是构造函数或类内方法的结果。仅供参考,我不是下选者。我想你的意思是
private void set\u Name(string value){}
public string Name{private get;private set;}
不会编译
无法为属性的访问器或索引器“Program.Name”指定可访问性修饰符
private string _name;
private string name;

public string Name

{

    get { return name; }

    set { name = value; }

}