访问和设置阵列类型属性
本文关键字:类型 属性 阵列 设置 访问 | 更新日期: 2023-09-27 18:17:52
我知道属性有以下形式:
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
提前感谢!
您可以直接公开属性getter,并使用它:
class MyOtherClass
{
public MyOtherClass()
{
myProperty = new int[3, 3];
}
public int[,] myProperty
{
get; private set;
}
}
你可以使用auto properties来绕过实际实现属性,让编译器为你完成;
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]);
}
}
除了直接公开数组的其他答案之外,您可以考虑使用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;
}
}
注意,您需要确保在访问Data之前对它进行初始化——我已经在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;
}
}
}
关于数组的事情是你需要在使用它们之前设置它们的大小。例如,您可以这样做:
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].
你可以用list代替array。
public Myclass
{
int a{get;set;};
int b{get;set;};
}
…
public List<MyClass> myList{get;set;}