zoukankan      html  css  js  c++  java
  • 在需要的时候可以给get、set加修饰符

    问题场景:

    我在写一个低层的东西,有一个类,其中一个字段我希望可以在其它的dll中获得该字段的值,而只能在类所在的dll中修改其值。

    下面是我解决这个问题的步骤,三种解决方案。

    1.第一反应的解决方案:

    class A
    {
        
    private string _name;

        
    public string Name
        
    {
            
    get return _name; }
        }


        
    internal string Name
        
    {
            
    set { _name = value; }
        }

    }

     

    也许你跟我一样会觉得这个方案可以,但是事实并非如此,此解决方案编译通不过,错误信息使对Name重复定义,也就是说.net framework 不允许将一个属性的geterseter分开去写。

    2.第二种解决方案

    既然不让声明两次属性名Name,那就只好将set改成方法了。 

    class A
    {
        
    private string _name;

        
    public string Name
        
    {

            
    get return _name; }
        }

        
    internal public void SetName(string value)
        
    {

            _name 
    = value;
        }

    }

    这种方法是可行的,但是不太好,继续思考,.net不能这么弱吧……于是有了一个正确的方法。

    3. 正确的解决方案 

    class A
    {
        
    private string _name;

        
    public string Name
        
    {
            
    get return _name; }
            
    internal set { _name = value; }
        }

    }

    internal关键字是可以修饰getset的。

     

    这个问题非常简单,但是却很容易被第一种方法,拖入第二种方法的陷阱中,而忘了第三种正确的方法。

     

    稍稍引申一下:

    1.既然可以给geter或者seter加修饰符,可否同时给geterseter加上修饰符 

    class A
    {
        
    private string _name;

        
    public string Name
        
    {
            
    internal get return _name; }
            
    private set { _name = value; }
        }

    }

    结果编译不能通过,错误是:不能为属性或索引器“A.Name”的两个访问器同时指定可访问性修饰符,也就是说geter或者seter中只能有一个指定修饰符,而不能同时指定修饰符,这样做的话默认修饰符就没有了意义。

    2.只给geter或者seter中的一种加上修饰符,换一种方式写 

    class A
    {
        
    private string _name;

        
    internal string Name
        
    {
            
    get return _name; }
            
    public set { _name = value; }
        }

    }

    这一次编译又报错了,.net说:访问器的可访问性修饰符必须比属性或索引器“A.Name”具有更强的限制,也就是说我们给geterseter所加的修饰符,必须是比属性上的修饰符更强的修饰符时才可以。

     

    结论:

    我们可以给Propertygeter或者seter中的某一个加上修饰符,条件是所加修饰符必须比Property定义的修饰符具有更强的限制。

     

  • 相关阅读:
    实现连续测试,要做的事情【译】
    Go语言HTTPServer开发的六种实现
    JSON必知必会【PDF+视频教程】
    给JSONObject添加自定义遍历方法
    利用守护线程隐式关闭线程池
    从错误中学习
    Groovy动态添加方法和属性及Spock单测
    持续测试、持续集成、持续交付、持续部署和DevOps
    有关OAuth 2.0简化模式中步骤D-F的解释
    Spring笔记(五):bean的自动装配
  • 原文地址:https://www.cnblogs.com/yukaizhao/p/geter_seter_internal.html
Copyright © 2011-2022 走看看