【问题标题】:Can I create a property in a struct with a "set" only accessible by a single concrete class?我可以在结构中创建一个只有单个具体类可以访问的“集合”的属性吗?
【发布时间】:2012-09-20 09:34:37
【问题描述】:

我知道这听起来有点奇怪,但我会试着解释一下:假设我有一个有很多属性的类,而且它们都是只读的,所以这个类是唯一可以修改它的类属性(它正在侦听一个事件,并用该事件中包含的信息填充属性)。

但是,我想在一些结构上封装一些属性,以创建一个组织良好的层次结构,所以这些结构的属性也应该是只读的,除了所有者类。例如:

public class A
{
    private int a1;
    public int A1 
    { 
        get{ return a1; } 
    }

    private B structB;
    public B StructB
    {
        get{ return structB; }
    }

    private method eventListenerMethod(...)
    {
        a1 = someValue;
        structB.B1 = otherValue; //I want that only this class can modify this property!
    }
}

public struct B
{
    private int b1;
    public int B1
    {
        get{ return b1; } // This property should be modifiable for Class A!!
    }
}

我想我不能做到这一点,但有谁知道我怎样才能做到这一点? 非常感谢您。

【问题讨论】:

标签: c# properties access-modifiers


【解决方案1】:

看来您所追求的是 C++ 中的“朋友”关键字。但是,它在 C# 中不存在,但“内部”是一个很好的折衷方案。因此,只需创建一个“内部集”属性,它可以(仅)在程序集中访问。因此,将使用您的程序集的其他人将无法访问它

【讨论】:

  • C# 中的 internal 完全等同于 VB.NET 中的 Friend
  • 是的,我一直在寻找“朋友”关键字,这是我需要的,但我喜欢这个解决方案:我的问题是使用我的 DLL 的其他程序不应该修改属性,并且这个解决方案实现了这一点。谢谢!!
  • public int B1 { internal set{ b1 = value; } get{ return b1; } // This property should be modifiable for Class A!! } 尝试这样的事情 - DLL 外部的代码将看到该属性,但只有 getter..
【解决方案2】:

struct改成class,改成private,但是把它的定义放在class A里面。

这意味着只有class A 可以访问其属性。然后class B 中的所有属性都可以公开(因为只有定义它的类才能访问它)。

这将导致编译器错误,因为class B 将是私有的,但会暴露在公共属性上。要解决此问题,请创建一个公共接口以公开为 IClassB 类型(名字不好,但您明白了)并将属性类型更改为接口。确保此接口仅对属性方法签名具有 get 访问器。

这样的事情应该可以工作:

public class A : IClassB
{
   public IClassB B { get; }

   private class B : IClassB
   {
       public int B1 { get; }
   }
}

public interface IClassB
{
   int B1 { get; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2011-12-27
    相关资源
    最近更新 更多