如何让嵌套结构访问其父 类 的字段而不使这些字段成为 public 或内部?
How can I give nested structs access to fields of their parent classes without making those fields public or internal?
我在 class 中有一个 double[,]
字段,重要的是不要让外部直接访问它,所以我创建了一个读写 属性控制它并使它成为private
。我在 class 中还有一个嵌套的 struct
,我想将其保留为值类型。该结构本身有一个 double[,]
字段,同样由相应的读写 属性 控制。在特定条件下,如果 属性 被分配了一个以特定方式无效的值,它会抛出自定义 exception
。我需要传递给 exception
的参数之一是基于来自父 class 的 double[,]
字段的值,但我似乎无法从在结构中而不使其成为 public
或 internal
。 protected
和 private
我都试过了,但都不行。还有其他解决方法吗?
class myClass {
protected double[,] classField;
public double[,] classProperty {
get { return (double[,])classField.Clone();
set { /* code to validate the value and assign it */ }
}
private struct myStruct {
private double[,] structField;
public structProperty{
get { return (double[,])structField.Clone(); }
set {
if (!validate(value))
throw new customException(classField.getLength(1));
structField = (double[,])value.Clone();
}
}
//other fields, constructors, and methods...
}
//other fields, constructors, and methods...
}
我正在考虑可能访问 属性 而不是字段,但我需要 属性 的值用于包含相关结构实例的特定实例。是否有类似 this.parent
的东西(我确实尝试过但没有用,但可能有一些概念上类似的解决方法)?
我假设您希望 myStruct
与包含 myClass
实例的 classField
对话。
如果是这样:那么问题不在于可访问性 - 它已经具有访问权限;问题是 scope。就编译器而言,这里的嵌套与实例化无关,所以问题是 myStruct
没有 classProperty
的特定 实例 可以与之交谈。这就是为什么错误是:
Error CS0120 An object reference is required for the non-static field, method, or property 'myClass.classField'
而不是可访问性:
Error CS0122 'myClass.classField' is inaccessible due to its protection level
事实上,就可访问性而言,classField
可以是 private
:嵌套类型可以看到包含类型的 private
个成员。
您需要做的是:
private struct myStruct
{
private readonly myClass _obj;
public myStruct(myClass obj) => _obj = obj;
// ...
}
然后你需要告诉它与 _obj.classField
对话以告诉它实例,而不仅仅是 classField
。您还需要构建 myStruct
并在 中传递 与之相关的特定 myClass
。
基本上:您在问题中提到的 this.parent
概念不是隐含的 - 您需要自己实现它。
我在 class 中有一个 double[,]
字段,重要的是不要让外部直接访问它,所以我创建了一个读写 属性控制它并使它成为private
。我在 class 中还有一个嵌套的 struct
,我想将其保留为值类型。该结构本身有一个 double[,]
字段,同样由相应的读写 属性 控制。在特定条件下,如果 属性 被分配了一个以特定方式无效的值,它会抛出自定义 exception
。我需要传递给 exception
的参数之一是基于来自父 class 的 double[,]
字段的值,但我似乎无法从在结构中而不使其成为 public
或 internal
。 protected
和 private
我都试过了,但都不行。还有其他解决方法吗?
class myClass {
protected double[,] classField;
public double[,] classProperty {
get { return (double[,])classField.Clone();
set { /* code to validate the value and assign it */ }
}
private struct myStruct {
private double[,] structField;
public structProperty{
get { return (double[,])structField.Clone(); }
set {
if (!validate(value))
throw new customException(classField.getLength(1));
structField = (double[,])value.Clone();
}
}
//other fields, constructors, and methods...
}
//other fields, constructors, and methods...
}
我正在考虑可能访问 属性 而不是字段,但我需要 属性 的值用于包含相关结构实例的特定实例。是否有类似 this.parent
的东西(我确实尝试过但没有用,但可能有一些概念上类似的解决方法)?
我假设您希望 myStruct
与包含 myClass
实例的 classField
对话。
如果是这样:那么问题不在于可访问性 - 它已经具有访问权限;问题是 scope。就编译器而言,这里的嵌套与实例化无关,所以问题是 myStruct
没有 classProperty
的特定 实例 可以与之交谈。这就是为什么错误是:
Error CS0120 An object reference is required for the non-static field, method, or property 'myClass.classField'
而不是可访问性:
Error CS0122 'myClass.classField' is inaccessible due to its protection level
事实上,就可访问性而言,classField
可以是 private
:嵌套类型可以看到包含类型的 private
个成员。
您需要做的是:
private struct myStruct
{
private readonly myClass _obj;
public myStruct(myClass obj) => _obj = obj;
// ...
}
然后你需要告诉它与 _obj.classField
对话以告诉它实例,而不仅仅是 classField
。您还需要构建 myStruct
并在 中传递 与之相关的特定 myClass
。
基本上:您在问题中提到的 this.parent
概念不是隐含的 - 您需要自己实现它。