C#学习笔记

1.parse()与try parse()

int.Parse()是一种类容转换;表示将数字内容的字符串转为int类型。 如果字符串为空,则抛出ArgumentNullException异常; 如果字符串内容不是数字,则抛出FormatException异常; 如果字符串内容所表示数字超出int类型可表示的范围,则抛出OverflowException异常; int.TryParse 与 int.Parse 又较为类似,但它不会产生异常,转换成功返回 true,转换失败返回 false。最后一个参数为输出值,即结果会赋值给这个参数,如果转换失败,输赋值为 0

int.TryParse(n1.Text, out P_int_Number) 其中第一个参数代表被转换的参数,第二个参数为转换后的参数 int类型,成功返回True,失败返回False。

2.is 与 as

在C#语言中进行类型转换的操作符is和as。is和as都是强制类型转换,但这两者有什么相同之处和不同之处呢?在使用is和as需要注意哪些事项?下面我们从简单的代码示例去探讨这个简单的问题。

is检查一个对象是否兼容于指定的类型,并返回一个Boolean值:true或者fasle。注意,is操作符永远不会抛出异常,请看以下示例:

ClassA

{

.... 

}

Object o=new Object();

Boolean b1=(o is Object); //b1为true. 

Boolean b2=(o is ClassA) ; b2为false.

如果对象引用是null,is操作符总是返回false,因为没有可检查的其类型的对象。

is 操作符通常像下面这样使用:

if(obj is ClassA)

{

    ClassA a=(ClassA) obj;

   ... 

 }

在这一段代码中,CLR实际会检查两次对象类型。is操作符首先核实obj是否兼容于ClassA 类型。如果是,那么在if语句内部执行类型转换时,CLR再次核实obj是否引用一个ClassA。
CLR的类型检查增强了安全性,但也会对性能造成一定的影响。这是因为CLR首先必须判断(obj)引用的对象的实际类型。然后CLR必须遍历继承层次结构,用每个基类型去核对指定的类型(ClassA)。 实际系统开发中,这是一个相当常用的编程模式,于是C#有了操作符as。 as与is做差不多的事情,类型显式强制转换。 as操作符的工作方式与强制类型转换一样,只是它永远不会抛出一个异常——相反,如果对象不能转换,结果就是null。 但as有其不同的地方,简化代码,同时提升性能。 请看示例代码: Object obj
=new Object(); ClassA a= obj as ClassA; if(a!=null) //在if判断a是否为null { ... } 在这一段代码中,CLR核实obj是否兼容于ClassA类型,如果是,as会返回对同一个对象的一个非null引用; 如果obj不兼容ClassA类型,as操作符会返回null。 因此,as操作符使CLR只检验一次对象的类型。 if语句只是检查a是否为null。这个检查的速度比检验对象的类型快得多。 所以正确做法是检查最终生成的引用是否为null。如果企图直接使用最终生成null的引用,会抛出一个 NullReferenceException异常。 示例代码: Object obj=new Object(); //创建一个object对象. ClassA a =obj as ClassA;//将obj转型为ClassA,此时转型操作会失败,不会抛出异常,但a会被设为null. a.ToString();//访问a会抛出一个NullReferenceException异常。

 3.Dictionary/HashTable/ArrayList

HashTable/ArrayList属于System.Collections;

Dictionary属于System.Collections.Generic;

其中Dictionary有泛型Dictionary<T,T>,可以直接通过键来获取值

Dictionary<string, string> d = new Dictionary<string, string>();
d.Add("Name", "张三");
d.Add("Rules", "红牌");
string str = d["Name"];

ArrayList无泛型,储存的是object,访问时需要强转

ArrayList ar = new ArrayList();
ar.Add(1);
ar.Add("123");
int t = (int)ar[0];
string ss = (string)ar[1];

HashTable四中遍历方式

Hashtable ht=new Hashtable();
ht.Add("1", "1111");
ht.Add("2", "2222");
ht.Add("3", "3333");
ht.Add("4", "4444");

//遍历方法一:遍历哈希表中的键
foreach(string key in ht.Keys)
{
     //Console.WriteLine(string.Format("{0}-{1}"), key, ht[key]);
     Console.WriteLine(string.Format("{0}-{1}", key, ht[key]));
}
//遍历方法二:遍历哈希表中的值
 foreach(string value in ht.Values)
 {
     Console.WriteLine(value);
 }
//遍历方法三:遍历哈希表中的键值
 foreach(DictionaryEntry de in ht)
 {
    Console.WriteLine(string.Format("{0}-{1}", de.Key, de.Value));
 }
            //遍历方法四:遍历哈希表中的键值
 IDictionaryEnumerator myEnumerator = ht.GetEnumerator();
 bool flag = myEnumerator.MoveNext();
 while (flag)
 {
    Console.WriteLine(myEnumerator.Key + "-" + myEnumerator.Value);
    //  Console.WriteLine(ht[myEnumerator.Key]);//ht[myEnumerator.Key]== myEnumerator.Value=true;
    flag = myEnumerator.MoveNext();
 }

 4.方法调用问题

静态方法可以以ClassName.StaticMethod() 或者在当前类内StaticMethod()方式调用、其他方法内直接调用(包括主方法)

 public static void Test()
{
     Console.WriteLine("静态方法测试");
            
}
public void Test2()
{
      Console.WriteLine("普通方法测试");
      Test();
}
 public void Test3()
{
      Test2();
}

普通方法无法在静态方法(包括主方法)内调用,可由Object.Method()方式调用,或者在当前类内另一个普通方法内直接调用,如上例。

猜你喜欢

转载自www.cnblogs.com/whwjava/p/9365634.html