我知道某个属性具有以下形式:
class MyClass
{
public int myProperty { get; set; }
}
这允许我这样做:
MyClass myClass = new MyClass();
myClass.myProperty = 5;
Console.WriteLine(myClass.myProperty); // 5
然而,我该怎么做以便以下类:
class MyOtherClass
{
public int[,] myProperty
{
get
{
// Code here.
}
set
{
// Code here.
}
}
}
行为如下:
/* Assume that myProperty has been initialized to the following matrix:
myProperty = 1 2 3
4 5 6
7 8 9
and that the access order is [row, column]. */
myOtherClass.myProperty[1, 2] = 0;
/* myProperty = 1 2 3
4 5 0
7 8 9 */
Console.WriteLine(myOtherClass.myProperty[2, 0]); // 7
提前致谢!
答案 0 :(得分:5)
您可以公开属性getter,并使用它:
class MyOtherClass
{
public MyOtherClass()
{
myProperty = new int[3, 3];
}
public int[,] myProperty
{
get; private set;
}
}
答案 1 :(得分:3)
您可以绕过实际实现该属性并允许编译器使用自动属性执行此操作;
public class Test
{
// no actual implementation of myProperty is required in this form
public int[,] myProperty { get; set; }
}
class Program
{
static void Main(string[] args)
{
Test t = new Test();
t.myProperty = new int[,] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
Console.WriteLine(t.myProperty[1, 2]);
t.myProperty[1, 2] = 0;
Console.WriteLine(t.myProperty[1, 2]);
}
}
答案 2 :(得分:3)
除了直接公开数组的其他答案外,您还可以考虑使用Indexer:
public class MyIndexedProperty
{
private int[,] Data { get; set; }
public MyIndexedProperty()
{
Data = new int[10, 10];
}
public int this[int x, int y] {
get
{
return Data[x, y];
}
set
{
Data[x, y] = value;
}
}
}
所以你的课可能看起来像这样:
public class IndexerClass
{
public MyIndexedProperty IndexProperty { get; set; }
public IndexerClass()
{
IndexProperty = new MyIndexedProperty();
IndexProperty[3, 4] = 12;
}
}
请注意,您需要确保在访问数据之前对其进行初始化 - 我已在MyIndexedProperty
构造函数中完成此操作。
在使用中,结果是:
IndexerClass indexedClass = new IndexerClass();
int someValue = indexedClass.IndexProperty[3, 4]; //returns 12
这种方法的主要优点是隐藏了调用者使用set和get方法存储值的实际实现方式。
您还可以在决定继续执行set
操作之前检查值,例如
public int this[int x, int y] {
get
{
return Data[x, y];
}
set
{
if (value > 21) //Only over 21's allowed in here
{
Data[x, y] = value;
}
}
}
答案 3 :(得分:1)
数组的问题是你需要先设置它们的大小才能使用它们。例如,你会做这样的事情:
class MyOtherClass
{
public MyOtherClass(int xMAx, int yMax)
{
MyProperty = new int[xMAx, yMax];
}
public int[,] MyProperty { get; private set; }
}
您的属性不需要公开set方法,因为它不是您设置的MyProperty
,而是内部值MyProperty
。例如,MyProperty [1,3]。
答案 4 :(得分:0)
你可以使用list而不是array。
public Myclass
{
int a{get;set;};
int b{get;set;};
}
.....
public List<MyClass> myList{get;set;}