学习笔记--静态方法调用,多肽,操作符重载,3中参数传递方式,二维数组与交错数组
1. 静态的方法只能调用其他静态的方法, 实例可以调用静态方法, 但需要仔细设计.(静态的只能调用静态的, 实例的可以调用静态的)
2. 方法使用动词或动词词组命名, 所有独立单词的首字母大写, 但private方法的第一个单词的字母可以小写, 也可以大写.
3. 多肽使用原则:
a. 要分清楚容器的类型和实例的类型: 多肽中, 容器的类型通常为基类型及接口.
b. 容器类型和实例类型之间的关系.
1). 同种类型容器可以控制同类型实例
2). 上层类型容器可以隐式控制下层类型实例
3). 同为某继承关系中的同层类型, 彼此不可以相互控制
4). 下层类型容器不可以隐式控制上层类型容器所控制的实例. 如果上层类型容器中所控制的实例类型符合下层类型容器的规范, 则可以使用强制转换达到控制目的, 否则失败.
4. 操作符重载: 在不改变操作符原意的情况下, 括大操作符的运算范围. 注意: 操作符的重载方法必须是在类中的静态方法, 且重载方法的参数是累的实例.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Person
{
private int _weight = 0;
public int Weigth
{
get
{
return this._weight;
}
set
{
this._weight = value;
}
}
public static int operator +(Person p1, Person P2)
{
return p1.Weigth + P2.Weigth;
}
}
class Program
{
static void Main(string[] args)
{
Person zs = new Person();
zs.Weigth = 100;
Person ls = new Person();
ls.Weigth = 150;
int result = zs + ls;
Console.WriteLine(result);
}
}
5. 三中参数传递方式: 值传参, 引用传参(ref传参, 需要提前初始化), 输出传参(out传参, 可以提前初始化, 也可以在方法内部初始化). 严格数来: 传递参数的方式只有两种: 值传参和地址(引用)传参, 其中地址(引用)传参包含ref传参和out传参
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Demo
{
static void Main(string[] args)
{
#region 值传参(传递值, 数据副本)
string province = "北京";
string avgweather = "晴转多云";
int avgtemp = 32;
showMsg(province, avgweather, avgtemp);
Console.WriteLine("--------------------------------------------\n");
#endregion
while (true)
{
Console.Write("请输入您要查询的区县名称(输入EXIT退出): ");
string name = Console.ReadLine().Trim();
if (name.ToLower() == "exit")
{
Console.WriteLine("感谢使用, 再见!");
break;
}
else
{
#region 引用传参(传递地址)
string weather = "尚未获取数据";//输入参数, 必须在外部先进行初始化
int temp;//未初始化, 输出参数可以在外部进行初始化, 也可以在调用方法内部进行初始化
Console.WriteLine("\n-------------" + name + "-----------------");
queryWeather(name, ref weather);//输入参数传参, ref传参
queryTemp(name, out temp);//输出参数传参, out 传参
showMsg(name, weather, temp);
#endregion
}
}
}
//注意: 这里的三个方法全是void无返回值的方法
private static void showMsg(string name, string weather, int temp)
{
Console.WriteLine(string.Format("< {0} >天晴情况为: < {1} >,平均气温为< {2} >",name,weather,temp));
}
private static void queryWeather(string name, ref string weather)
{
switch(name)
{
case "海淀":
weather = "多云";
break;
case "西城":
weather = "大到暴雨";
break;
case "朝阳":
weather = "雨夹雪";
break;
case "崇文":
weather = "雷阵雨";
break;
case "延庆":
weather = "冰雹";
break;
case "昌平":
weather = "大风6-7级";
break;
case "丰台":
weather = "晴天";
break;
case "平谷":
weather = "暴雪";
break;
case "顺义":
weather = "多云";
break;
case "大兴":
weather = "暴风雨敬告";
break;
default:
weather = "不属于北京辖区, 天气未知, 建议撤离!";
break;
}
}
private static void queryTemp(string name, out int temp)
{
Random ran = new Random();
temp = ran.Next(0,40);
}
}
6. c#中二维数组和交错数组分配内存的方式:
假设有二维数组定义(m,n都是整数数字) 和交错数组定义(假设交错数组的每一维度长度都是n):
int[,] intary = new int[m,n];
int[][] jaggedary = new int[m][];
for(int i=0;i<m;i++)
{
jaggedary[i] = new int[n];
}
则:
二维数组在内存中, 先开辟一个大小为m*n的空间(实际所占字节数为m*n*整数的4字节), 然后将该块存储空间m等分, 每一分的大小恰好为n; 也就是说二维数组是先在内存中分配完m*n的空间后, 在通过等分确定每一维度的大小, 如果输出intary.Length的话, 其值为m*n.
而交错数组现在内存中开辟一块大小为m*4(地址或者说引用占4字节), 然后m块中的每一块存放另外一个长度为n的一维数组的引用. 当然这里只是便于表述, 这个一维数组可以使任何长度大于或小于n的数组
因此:
获得二维数组的维度不能使用Length属性, intary.Length实际得到的是整个二维数组所占的空间, 而应该使用intary.GetLength(0);获得第一维的长度, 即行数; 通过intary.GetLength(1)获得第二位的长度, 即列数.
对于交错数组, 可以直接使用jaggedary.Length获得第一维的维度, 通过jaggedary[i].Length获得第二维的维度. 更多维数的数组类似.