《C#入门经典(中文第四版)》第6章学习笔记
---------------------------------------------------------------------------------------------------------
A1 ………… 函数 A2 ………… ArrayList 类 A3 ………… Hashtable 类 A4 ………… Random 类 A5 ………… Math 类 A6 ………… DateTime 结构 A7 ………… TimeSpan 结构 A8 ………… DateAndTime 结构 A9 ………… Format 类
---------------------------------------------------------------------------------------------------------
╔════════╗ ╠════╣ 第A1个 ╠══════════════════════════════════════════════════╣ ╚════════╝
●·● 函数:
1. 函数Main()是控制台应用程序的入口点函数~void表示函数没有返回值!下面是有返回值的:
static <returnType> <functionName>() { ... return <returnValue>; //在执行到return语句时,程序会立即返回调用代码,函数立即终止! } //return语句是一定要执行的,函数必须要有返回值!
2. 带有参数的函数:
static <returnType> <functionName>(<paramType> <paramName>, ...) { ... return <returnValue>; }
3. 全局变量和局部变量:用static关键字来定义,当全局变量和局部变量同名时,要在全局变量的前面加上类名,如果没有局部变量会被使用,而全局变量会被屏蔽掉,例如在下面Main函数中,Program.myString是全局变量,而myString是局部变量。如果不是同名,则可以直接用!
-
View Code - 全局变量&局部变量
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace Ch06Ex01 { class Program { staticstring myString;
staticvoid Write() { string myString = "String defined in Write()"; Console.WriteLine("Now in Write()"); Console.WriteLine("Local myString = {0}", myString); Console.WriteLine("Global myString = {0}", Program.myString); }
staticvoid Main(string[] args) { string myString = "String defined in Main()"; Program.myString = "Global string"; Write(); Console.WriteLine("\nNow in Main()"); Console.WriteLine("Local myString = {0}", myString); Console.WriteLine("Global myString = {0}", Program.myString); Console.ReadKey(); } } //Output:
//Now in Write() //Local myString = String defined in Write() //Global myString = Global string
//Now in Main() //Local myString = String defined in Main() //Global myString = Global string }
- 若变量在循环内部初始化,则在外部无法调用这个变量,因为在循环结束时,值会丢失,在for循环中定义的变量,在for外面不可以调用,所以在定义变量的时候要初始化。
-
View Code - 错误
staticvoid Main(string[] args) { string text; for ( int i = 1; i < 10;i++) { text = "Line " + Convert.ToString(i); Console.WriteLine("{0}",text); } Console.WriteLine("{0}",text); //错误:使用了未赋值的局部变量“text” //text在for循环中赋值了,但是退出for后值机会消失 Console.ReadKey(); }
4. 参数数组:
static <returnType> <functionName>(<p1Type><p1Name>, ... ,params <type>[] <name>) { ... return <returnValue>; }
-
View Code - 参数数组举例
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace Ch06Ex03 { class Program { staticint SumVals(int m,paramsint[] vals) //参数数组 { int sum = 0; foreach (int val in vals) { sum += val; } return sum * m; }
staticvoid Main(string[] args) { int i = 100; int sum = SumVals(i, 1, 5, 2, 9, 8); //调用函数,随意写入数组 int sum2 = SumVals(i, 2, 4, 4, 5, 6, 6, 7, 7); Console.WriteLine("Summed Values = {0}", sum); Console.WriteLine("Summed Values = {0}", sum2); int[] exer = { 1, 3, 4, 5, 6, 7 }; //直接定义数组 Console.WriteLine("summed Values = {0}", SumVals(i, exer)); Console.ReadKey(); }
//Summed Values = 2500 //Summed Values = 4100
} }
5. 引用参数、值参数、输出参数
- 值参数(val):把一个值传递给函数使用,对函数中此变量的任何修改都不影响函数调用中指定的参数。
- 引用参数(ref):对这个变量进行的任何改变都会影响用作参数的变量值,使用ref关键字指定参数。
-
View Code - 引用参数2例
staticint ShowDouble(refint val) { val *= 2; return val; }
staticvoid Main(string[] args) { int myNumber = 5; Console.WriteLine("myNumber = {0}", myNumber); Console.WriteLine("myNumber.ShowDouble = {0}", ShowDouble(ref myNumber)); Console.WriteLine("myNumber.ShowDouble = {0}", ShowDouble(ref myNumber)); Console.WriteLine("myNumber.ShowDouble = {0}", ShowDouble(ref myNumber)); Console.WriteLine("myNumber.ShowDouble = {0}", ShowDouble(ref myNumber)); Console.WriteLine("myNumber.ShowDouble = {0}", ShowDouble(ref myNumber)); Console.WriteLine("myNumber = {0}", myNumber); Console.ReadKey(); } //myNumber = 5 //myNumber.ShowDouble = 10 //myNumber.ShowDouble = 20 //myNumber.ShowDouble = 40 //myNumber.ShowDouble = 80 //myNumber.ShowDouble = 160 //myNumber = 160 //请按任意键继续. . .
staticvoid ShowDouble(refint val) { val *= 2; Console.WriteLine("val doubled = {0}", val); }
staticvoid Main(string[] args) { int myNumber = 5; Console.WriteLine("myNumber = {0}", myNumber); ShowDouble(ref myNumber); //在调用函数的时候不要忘记ref Console.WriteLine("myNumber = {0}", myNumber); Console.ReadKey();
} //myNumber = 5 //val doubled = 10 //myNumber = 10
- 输出参数(out):执行方式与引用参数完全一样,区别:把未赋值的变量用作ref参数是非法的,但可以把未赋值的变量用作out参数,因为out参数在定义函数的时候必须要先初始化。
-
View Code - ref与out区别
staticvoid Main(string[] args) { int[] outArray; int[] refArray = { 1, 2, 3, 4, 5 }; //使用out传递数组 outArrayMethod(out outArray);//适用out关键字前不必进行初始化 Console.WriteLine("使用out传递数组:"); //使用for循环输出数组元素的值 for (int i = 0; i < outArray.Length; i++) { Console.Write(outArray[i] + ""); Console.WriteLine("outArray[{0}] = {1}", i, outArray[i]); } // 使用ref传递数组 refArrayMethod(ref refArray);//适用ref关键字前必须进行初始化 Console.WriteLine("\n使用ref传递数组:"); //使用for循环输出数组元素的值 for (int i = 0; i < refArray.Length; i++) { Console.WriteLine("refArray[{0}] = {1}", i, refArray[i]); }
Console.ReadLine(); } ///<summary> /// 使用out传递数组 ///</summary> ///<param name="arr">int类型数组</param> staticvoid outArrayMethod(outint[] arr) { // 创建数组 arr = newint[5] { 1, 2, 3, 4, 5 }; } ///<summary> /// 使用ref传递数组 ///</summary> ///<param name="arr">int类型数组</param> staticvoid refArrayMethod(refint[] arr) { //如果为空则重新创建 if (arr == null) { arr = newint[8]; } arr[0] = 1234; arr[3] = 4321; }
//使用out传递数组: //1 outArray[0] = 1 //2 outArray[1] = 2 //3 outArray[2] = 3 //4 outArray[3] = 4 //5 outArray[4] = 5
//使用ref传递数组: //refArray[0] = 1234 //refArray[1] = 2 //refArray[2] = 3 //refArray[3] = 4321 //refArray[4] = 5
6. 可以定义两个名称相同的函数,但是其类型要不同,不能通过不同的返回值类型来定义相同的函数,因为签名(名称+类型)是相同的。
static void ShowDouble(ref int val) { ... } static void ShowDouble(int val) { ... } static void ShowDouble(double val) { ... } //三个不同的函数,参数的类型是不同的,只不过名字是相同的
---------------------------------------------------------------------------------------------------------
╔════════╗ ╠════╣ 第A2个 ╠══════════════════════════════════════════════════╣ ╚════════╝
1. ArrayList类在System.Collections命名空间中!
ArrayList Li = new ArrayList(); ArrayList Li = new ArrayList(5); 通过Add方法可以加入各种类型的数据,若是超过容量,则容量会成倍自动增加!
2. ArrayList 构造函数:
- ArrayList():ArrayList 类的新实例,该实例为空并且具有默认初始容量。
- ArrayList(ICollecion):ArrayList 类的新实例,该实例包含从指定集合复制的元素并且具有与所复制的元素数相同的初始容量。
- ArrayList(Int32):ArrayList 类的新实例,该实例为空并且具有指定的初始容量。
- 上面ICollection可以是ArrayList,也可以是Array,即普通数组,如下示例:
-
View Code - ArrayList构造函数举例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections;
namespace ConsoleApplication5 { class Program { staticvoid Main(string[] args) { Animal[] animalArray = new Animal[2]; animalArray[0] = new Cow("Hellen"); animalArray[1] = new Chicken("Hen");
ArrayList animalArrayList = new ArrayList(); animalArrayList.Add(new Cow("Hellen2")); animalArrayList.Add(new Chicken("Hen2"));
animalArrayList.AddRange(animalArray);
ArrayList animalArrayList2 = new ArrayList(animalArrayList);
Console.WriteLine(animalArrayList2.Count);
foreach (Animal myAnimal in animalArrayList2) { Console.WriteLine(myAnimal.Name); }
ArrayList animalArray2 = new ArrayList(animalArray); foreach (Animal myAnimal in animalArray2) { Console.WriteLine(myAnimal.Name); }
} }
publicabstractclass Animal { protectedstring name;
publicstring Name { get { returnthis.name; } set { this.name = value; } }
public Animal() { name = "The animal with no name"; }
public Animal(string newName) { name = newName; }
publicvoid Feed() { Console.WriteLine("{0} has been fed.", name); } }
publicclass Cow : Animal { publicvoid Milk() { Console.WriteLine("{0} has been milked.", name); }
public Cow(string newName) : base(newName) {
} }
publicclass Chicken : Animal { publicvoid LayEgg() { Console.WriteLine("{0} has laid an egg.", name); }
public Chicken(string newName) : base(newName) {
} }
//4 //Hellen2 //Hen2 //Hellen //Hen //Hellen //Hen //请按任意键继续. . . }
3. ArrayList 方法:
- Add:将对象添加到ArrayList的结尾处。
- AddRange:将数组的元素添加到ArrayList的末尾。
- Clear:从ArrayList中移除所有元素。
- IndexOf(Object):第一个匹配的索引。
- IndexOf(Object, Int32):指定初始查询位置。
- Insert:将元素插入ArrayList的指定索引处。
- InsertRange:将数组元素插入ArrayList的指定索引处。
- LastIndexOf(Object):搜索指定要素,并返回整个ArrayList中最后一个匹配项的索引。
- LastIndexOf(Object, Int32):搜素int32范围内最后一个匹配的索引。
- Remove:从ArrayList中移除特定对象的第一个匹配项。
- RemoveAt:移除ArrayList的指定索引处的元素。
- RemoveRange:从ArrayList中移除一定范围的元素,索引+个数。
- Reverse:将整个ArrayList中元素的顺序反转。
- Reverse(Int32, Int32):将指定范围中元素的顺序反转。
- Sort:对整个ArrayList中的元素进行排序。
- ToString:返回表示当前对象的字符串。
4. ArrayList 属性:
- Capacity:获取或设置ArrayList可包含的元素数。
- Count:获取ArrayList中实际包含的元素数。
View Code - ArrayList举例
staticvoid Main(string[] args) { ArrayList Li = new ArrayList(4); Console.WriteLine("Li中的元素个数为{0}", Li.Count); Console.WriteLine("Li中的容量为{0}", Li.Capacity); Console.WriteLine();
Li.Add("Alex"); Li.Add("McDelfino"); Li.Add('a'); Li.Add("Alex"); Li.Add("Alex"); Li.Add(3); Li.Add("Alex"); Li.Add("Alex"); Li.Add("Alex"); Li.Add(1); for (int i = 0; i < Li.Count;i++) { Console.WriteLine(Li[i]); } Console.WriteLine(); int[] inum = {1,3,5,7,9}; Li.AddRange(inum); for (int i = 0; i < Li.Count;i++) { Console.WriteLine(Li[i]); } Console.WriteLine();
Li.InsertRange(3, inum); for (int i = 0; i < Li.Count; i++) { Console.WriteLine(Li[i]); } Console.WriteLine();
Li.RemoveAt(3); for (int i = 0; i < Li.Count; i++) { Console.WriteLine(Li[i]); } Console.WriteLine();
Li.RemoveRange(4, 4); for (int i = 0; i < Li.Count; i++) { Console.WriteLine(Li[i]); } Console.WriteLine();
Console.ReadKey();
} //Alex //Alex //3 //Alex //Alex //Alex //1 //1 //3 //5 //7 //9
//Alex //McDelfino //a //3 //5 //7 //9 //Alex //Alex //3 //Alex //Alex //Alex //1 //1 //3 //5 //7 //9
//Alex //McDelfino //a //3 //Alex //3 //Alex //Alex //Alex //1 //1 //3 //5 //7 //9
---------------------------------------------------------------------------------------------------------
╔════════╗ ╠════╣ 第A3个 ╠══════════════════════════════════════════════════╣ ╚════════╝
1. Hashtable类在System.Collections命名空间中!
Hashtable ht = new ArrayList(); Hashtable ht = new ArrayList(5);
View Code - 遍历Hashtable2例
staticvoid Main(string[] args) { Hashtable ht = new Hashtable(); ht.Add("001", "number"); ht.Add("002", "number"); ht.Add("003", "number"); ht.Add("004", "number"); ht.Add("005", "number");
Console.WriteLine("输出ht的键/值的对数为:{0}",ht.Count); foreach(DictionaryEntry de in ht) //关键字DictionaryEntry定义每个哈希值 { Console.Write("{0,-4}", de.Key); Console.Write("{0,-4}", de.Value); Console.WriteLine();
} Console.WriteLine(); foreach (string s in ht.Keys) { Console.Write("{0,-4}", s); Console.Write("{0,-4}", ht[s]); Console.WriteLine(); }
Console.ReadKey();
}
//输出ht的键/值的对数为:5 //003 number //004 number //005 number //001 number //002 number
//003 number //004 number //005 number //001 number //002 number
2. Hashtable 方法:
- Add:将带有指定键和值的元素添加到Hashtable。
- Clear:从Hashtable中移除所有元素。
- Contains:确定Hashtable是否包含特定键。
- ContainsKey:同上。
- ContainsValue:确定Hashtable是否包含特定值。
- Remove:从Hashtable中移除带有指定键的元素。
- ToString:返回表示当前对象的字符串。
3. Hashtable 属性:
- Count:获取包含在Hashtable中的键/值对的数目。
- Keys:获取包含Hashtable中的键的ICollection。
4. Values:获取包含Hashtable中的值的ICollection。
DictionaryEntry 结构:用来遍历Hashtable中的成员。
① 用 Hashtable 建立 distinct 集合!
private void loadRegionData() { comboBox4.Items.Clear(); ILayer pLayer = axMapControl1.get_Layer(0); IFeatureLayer pFLayer = pLayer as IFeatureLayer; IFeatureClass pFClass = pFLayer.FeatureClass; IFields pFields = pFClass.Fields; int Index = pFClass.FindField("REGION"); //找到列所在的 Index!
IFeatureCursor pFCursor = pFClass.Search(null, false); //用于循环 IFeature pFeature = pFCursor.NextFeature(); //用于获取每一个feature
Hashtable ht = new Hashtable(); //新建Hashtable
while (pFeature != null) { string name = pFeature.get_Value(Index); //获取 Index 列的值! if (!ht.ContainsKey(name)) //判断ht中是否含有name的Key,没有就添加 { ht.Add(name, name); } pFeature = pFCursor.NextFeature(); }
foreach (object o in ht.Values) //遍历ht中的Values { comboBox4.Items.Add(o.ToString()); } comboBox4.Text = comboBox4.Items[0].ToString(); }
※ 如何修改HashTable中指定键的值
---------------------------------------------------------------------------------------------------------
╔════════╗ ╠════╣ 第A4个 ╠══════════════════════════════════════════════════╣ ╚════════╝
1. 表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备。
2. Random 构造函数:
- Random():使用与时间相关的默认种子值,初始化Random类的新实例。所以在一个循环中生成的随机数是相同的。
- Random(Int32):使用指定的种子值初始化Random类的新实例。每个数字对着一个随机数,同一范围内的这个数是不变的。
-
View Code - Random()举例
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { staticvoid Main(string[] args) { for (int i = 1; i < 10;i++ ) { Random num = new Random(); Random num2 = new Random(); int a = num.Next(10); int b = num2.Next(10); Console.WriteLine("{0} ----- {1}",a,b); }
} } //4 ----- 4 //4 ----- 4 //4 ----- 4 //4 ----- 4 //4 ----- 4 //4 ----- 4 //4 ----- 4 //4 ----- 4 //4 ----- 4 //请按任意键继续. . . }
-
View Code - Random(Int32)举例
using System; using System.Collections.Generic; using System.Linq; using System.Text;
namespace ConsoleApplication1 { class Program { staticvoid Main(string[] args) {
|
请发表评论