一、当向方法中传递参数时,如果参数是值类型,那么在方法中该参数所有变化将不会保留下来,一旦方法结束,参数结果也会销毁。而如果参数是应用类型的时候,方法中参数的改变将会保留下来。例如参数是数组、类等,但是这里要注意的是string却不会保留变化。
可以使用out和ref关键字将值类型参数强制保持方法中对参数的改变。方法的调用依然得加上两个关键字。但是两者应用的过程当中,存在某些区别,使用ref,在方法调用的时候必须对其进行初始化,而使用out关键字则只需要在使用参数之前对参数声明,而不必要初始化。例如:
class Program
{
public static void change (out int i)
{
i = 100;
}
static void Main(string[] args)
{
int i;
change(out i);
Console.WriteLine(i);
}
}
以上能正常编译,但是当把out换成ref就会出错了。
二、readonly关键字比常量变量使用起来更具有有灵活性,同样用它来声明的变量不能改变,它的初始化在构造函数中进行。
三、关于继承的构造函数,当初始化继承类的时候,将同时初始化基类没有带参数的构造函数(谨记),先调用基类构造函数在调用继承类的。当继承类中有带参数的构造函数时,基类必需显式定义声明不带参数的构造函数,否则会报错。而当使用base关键字重载基类的构造函数时,一下两个好例子很好帮助了解:
//Demo1:
class Nevermore60Customer : GenericCustomer
{
public Nevermore60Customer(string name, string referrerName) //重载了基类中只含有name参数的构造函数
: base(name)
{
this.referrerName = referrerName;
}
private string referrerName;
private uint highCostMinutesUsed;
//Demo2:
public Nevermore60Customer(string name)
: this(name, “ < None > ”) //这个表示当没有第二个参数的时候就是用默认的值
{
}
四、array类的几个用法:
//Array arr = Array.CreateInstance(typeof(int), 5); //创建一个整型的大小为数组,因为所有的数组都是继承自array类的,而array类是抽象类,但有一个CreateInstance来创建一个数组。
//for (int i = 0; i < 5; i++)
//{
// arr.SetValue(i, i); //给数组赋值,第一参数是赋予的值,第二个是数组中的位置
//}
//Console.WriteLine("the array :");
//for (int i = 0; i < 5;i++ )
//{
// Console.WriteLine(arr.GetValue(i)); //获取数组的值
//}
int[] arr=new int[]{5,7,9,2,1,8};
for (int i = 0; i < 6;i++ )
{
Console.WriteLine(arr[i]);
}
Array.Sort(arr); //c# .Net Framework中Array的Sort方法其实是一个冒泡排序的方法
for (int i = 0; i < 6; i++)
{
Console.WriteLine(arr[i]);
}
Console.ReadLine();
Array类是实现了IEnumerable,ICollection和IList接口以访问和遍历数组中的元素。
五、yield return returns one element of a collection and moves the position to the next element, and yield
break stops the iteration.
IEnumerable使用的好例子:
public class MusicTitles
{
string[] names = {
“Tubular Bells”, “Hergest Ridge”,
“Ommadawn”, “Platinum” };
public IEnumerator GetEnumerator() //直接通过类的迭代来返回这里面yield return的内容
{
for (int i = 0; i < 4; i++)
{
yield return names[i];
}
}
public IEnumerable Reverse() //遍历语句块里面yield return的所有内容
{
for (int i = 3; i > = 0; i--)
{
yield return names[i];
}
}
public IEnumerable Subset(int index,int length) //访问其中的子元素
{
for (int i = index; i < index + length;
i++)
{
yield return names[i];
}
}
}
public class program
{
static void main()
{
MusicTitles titles = new MusicTitles();
foreach (string title in titles)
{
Console.WriteLine(title);
}
Console.WriteLine();
Console.WriteLine(“reverse”);
foreach (string title in titles.Reverse())
{
Console.WriteLine(title);
}
Console.WriteLine();
Console.WriteLine(“subset”);
foreach (string title in titles.Subset(2, 2))
{
Console.WriteLine(title);
}
}
}
浙公网安备 33010602011771号