【问题标题】:What is internal set property in c#?c#中的内部设置属性是什么?
【发布时间】:2011-08-25 09:14:16
【问题描述】:

我刚刚遇到了一个未知的 c# 概念。 谁能告诉我内部设置属性的目的是什么? 它的用途是什么? 我知道 internal 关键字用于在程序集中工作。

【问题讨论】:

    标签: c#


    【解决方案1】:

    如果您有一个带有内部 set 访问器(和公共 get 访问器)的属性,则意味着程序集中的代码可以读取(获取)和写入(设置)该属性,但其他代码只能读取它。

    您可以通过阅读internal access modifierpublic access modifierproperties 来获得上述信息。

    此外,您还可以阅读Restricting Accessor Accessibility

    【讨论】:

    • +1,另外,我可能想在您的答案中补充一点,我已经看到在两种情况下使用了内部集:1.)“隐藏”东西,这可能不是一个好方法并可能指向设计流程和 2.) 单元测试目的
    • UrbanEsc 我同意这似乎指向一个设计缺陷,大多数时候你都会看到它。我刚刚在我正在使用的一些代码中遇到了这个问题,它似乎是与另一个类的依赖关系的来源(是内部的,因此它可以克服私有的访问限制。)你不得不想知道为什么人们选择诸如这在更明显的事情上。
    • @JuniorM 其他代码将是另一个程序集。同一程序集中的代码,但不同的命名空间仍然可以访问它。
    • Internal 在理论上似乎是一个不错的概念,因为它支持封装,但在实践中,如果您必须在您不拥有的程序集中扩展某些内容,它将破坏继承。
    【解决方案2】:

    假设您正在设计一个供其他程序员使用的 API。在此 API 中,您有一个对象 Foo,它具有属性 Bar。您不希望其他程序员在引用您的程序集时设置 Bar 的值,但您需要自己在 API 中设置该值。只需像这样声明属性:

    public class Foo
    {
       public string Bar { get; internal set; }
    }
    

    【讨论】:

      【解决方案3】:

      Properties in C# 2.0

      在 C# 2.0 中,您可以设置 get 和 set 的可访问性。

      下面的代码显示了如何使用内部集和公共获取来创建私有变量。 Hour 属性现在只能从同一模块 (dll) 中的代码设置,但所有使用包含该类的模块 (dll) 的代码都可以访问。

      // private member variables
      private int hour;
      
      // create a property
      public int Hour
      {
        get { return hour; }
        internal set { hour = value; }
      }
      

      【讨论】:

        【解决方案4】:

        如果使用内部访问修饰符标记属性设置器,则只有位于程序集中的类才能设置该属性。

        public string MyProperty { get; internal set; }
        

        【讨论】:

          【解决方案5】:

          给定一个声明为public string MyString {get; internal set;} 的属性,这意味着

          • 您可以在您的应用程序中读取属性值从任何地方 (public string MyString)
          • 但您只能从在声明它的程序集内 或从朋友程序集向属性写入一个新值。 (internal set;)

          【讨论】:

            【解决方案6】:

            这意味着该属性只能由与删除该属性的类位于同一程序集中的代码设置。

            【讨论】:

              【解决方案7】:

              它是一种结构,它允许仅由同一程序集中的代码设置属性的值。

              【讨论】:

                【解决方案8】:

                它主要与构造函数一起使用,例如

                public class CustomerConfig
                {
                     public string CustomerName { get; internal set; }
                     public CustomerConfig(string customerName)
                     {
                        this.CustomerName = customerName;
                     }
                }
                

                通过这种方式,您可以预设一些参数,并使它们对代码中的其他程序集只读。

                【讨论】:

                  猜你喜欢
                  • 2018-11-20
                  • 1970-01-01
                  • 2017-03-27
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-06-15
                  • 2023-01-08
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多