Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么使用公共变量?_C#_Variables_Access Modifiers - Fatal编程技术网

C# 为什么使用公共变量?

C# 为什么使用公共变量?,c#,variables,access-modifiers,C#,Variables,Access Modifiers,变量、方法和类可以接受不同的安全级别。 根据我的经验,有: 公共 内部 受保护的 内部保护 私人的 现在,我了解了使方法和类私有、内部或受保护的用法,但是变量呢?即使我将变量设为private,我也可以使用属性从不同的类调用它 我一直认为物业是最佳实践。所以如果我可以使用它,我不需要通过实例直接调用变量 是否有任何理由不将变量设为私有 编辑:我看到一些人在谈论房产,好像他们只是 快速提醒:公共变量只返回它们的值。使用属性,您可以做更多的事情。例如: public int AmountOfBook

变量、方法和类可以接受不同的安全级别。 根据我的经验,有:

公共
内部
受保护的
内部保护
私人的

现在,我了解了使方法和类私有、内部或受保护的用法,但是变量呢?即使我将变量设为private,我也可以使用属性从不同的类调用它

我一直认为物业是最佳实践。所以如果我可以使用它,我不需要通过实例直接调用变量

是否有任何理由不将变量设为私有

编辑:我看到一些人在谈论房产,好像他们只是

快速提醒:公共变量只返回它们的值。使用属性,您可以做更多的事情。例如:

public int AmountOfBooks{
  get {
    //code to check certain conditions
    //maybe trigger an event while we're at it.
    //and a few conditionals.
    return this.amountOfBooks;
  }

  set {
    //a few conditionals
    //maybe trigger an event
    this.amountOfBooks = value;
    //and I can do even more... I think, never tried this.
  }
}

看过我个人资料的人都知道我是学生。使用属性作为“美化的公共变量”是我看到很多同学都在做的事情。当告诉他们可以这样做时,最常见的回答是:“允许这样做吗?”

当然,在某些情况下,使用公共字段是有意义的。例如,如果您创建的结构仅用于与现有非托管win32 API的互操作性

但是,如果要构建常规的托管对象模型,最佳做法是将对象的属性建模为属性,并使用字段作为私下实现公开功能的机制

更新:我要借此机会指出,我们已经尝试在C#3.0中非常容易地编写一个只访问备份存储的属性:

public int Foo { get; set; }
完全一样

private int _Foo;
public int Foo { get { return _Foo; } set { _Foo = value; } }
但要短得多,更容易阅读。当然,如果您以后需要使用备份存储将其扩展为长格式,那么这样做并不是一个突破性的改变

您也可以这样做:

public int Foo { get; private set; }

如果要使属性成为只读的,以便在类/结构之外进行编码。

例如,如果您有一个具有属性id\u code的类

如果属性是公共的,我可以用任何类型的值设置这个变量

如果您将此id_代码定义为私有,并为其设置一个方法,则可以制定有关id_代码格式的规则。 因此,该方法:

public setIdCode(String id) {
    my_attribute_id_code = "000"+id;
}

这是第一个简单的例子。

在我脑海中,我可以想到两个地方可以使用公共字段

  • 以常量或只读方式发布 程序集使用者的值
  • 在那里,我是被迫的部分 基础架构(如工作流中的 基金会)

  • 对。例如,将字段标记为protected允许派生类直接使用它,而派生类在概念上仍然保持着面向对象的理念


    不过,总的来说,你是对的。通常,最好将类的字段标记为私有字段,并将必要的字段公开为属性。这有助于封装、字段验证和代码维护等工作。

    如果您的属性说
    状态属于以下性质:
    public int Status{get;set;}

    有些人可能只是使用:

    公共int状态

    如果在设置或获取变量时需要执行任何代码,或者如果API中涉及任何不兼容的更改(如果将来需要添加此类代码),则属性是最佳做法

    由于后一个子句,在需要这种不兼容更改的语言中“先发制人”地使用访问器(最著名的例子是Java中的
    getThis
    /
    setThis
    约定)


    但是,如果您的语言允许您从公共变量切换到属性,反之亦然,而API中没有任何不兼容的更改(如C#、Ruby、Python等),那么在公共访问器(getter和setter)出现问题时,携带完整的样板文件是愚蠢的除了复制到私有变量和从私有变量复制之外,什么也不做——即使你确信你的编译器可以优化它们,这样的样板访问器只是徒劳地膨胀了源代码,浪费了一个重要的设计特性,而这正是使这些语言成为优秀语言的一部分;-)

    在某些情况下,字段的处理方式与属性不同。标准序列化格式化程序(BinaryFormatter和SoapFormatter)将序列化字段,但不会序列化属性。有时可能需要这样做来控制类型的序列化。

    有两个原因尚未提及:

  • 字段可以作为ref参数直接传递给方法。例如,可以在一个字段上调用'Interlocked.Increment',例如,以线程安全的方式(前提是该字段的其他用户也使用'Interlocked'例程访问它)。将属性复制到局部变量,通过引用传递该变量,然后将该变量复制回属性,将产生不同的语义。
  • 结构类型的字段可以比结构类型的属性更有效地访问和操作。事实上,与可变或大型结构相关的许多“问题”和低效率实际上源于这样一个事实:属性假装是变量,但实际上不是。
    这并不意味着将事物作为属性而不是字段公开没有好处,但字段确实有一定的好处。

    +1-我只是想把readonly和const关键字作为一个理由。+1--他们不应该害怕。在某种程度上,它就像是
    goto
    关键字。公共变量很容易出错,尤其是当被其他人重用时。你能详细说明一下为什么你认为这是最佳实践吗,特别是对于仅将其值复制到私有实例成员的属性?这样做是为了能够在不影响使用者的情况下更改属性的实现。(1)将来将字段更改为属性是一个突破性的更改。(2) 属性用于对对象的属性进行建模。因此得名。假设