关于C#3.0和.net一些问题的理解
2008-02-02 16:32
525 查看
1.string 和 System.String
string和System.String 是完全相同的写下面的代码,编译之后,使用ildasm.exe查看生成的IL代码,可以发现是完全一样的
class Program { static void Main(string[] args) { var pString = new PersonString("Xg", "Luxv"); System.Console.WriteLine(pString); var pSystemString = new PersonSystemString("Xg", "Luxv"); System.Console.WriteLine(pSystemString); } } internal class PersonString { public string FirstName { get; private set; } public string LastName { get; private set; } public PersonString(string FirstName, string LastName) { this.FirstName = FirstName; this.LastName = LastName; } public void Replace(string TextToFind, string ReplacingText) { FirstName = FirstName.Replace(TextToFind, ReplacingText); LastName = LastName.Replace(TextToFind, ReplacingText); } public override string ToString() { return FirstName + " " + LastName; } } internal class PersonSystemString { public System.String FirstName { get; private set; } public System.String LastName { get; private set; } public PersonSystemString(System.String FirstName, System.String LastName) { this.FirstName = FirstName; this.LastName = LastName; } public void Replace(System.String TextToFind, System.String ReplacingText) { FirstName = FirstName.Replace(TextToFind, ReplacingText); LastName = LastName.Replace(TextToFind, ReplacingText); } public override System.String ToString() { return FirstName + " " + LastName; } }
2.匿名类型 Var
匿名类型在第一次赋值时已经确定了类型,所以下面的代码是通不过编译的,不是可变类型,呵呵class Program { static void Main() { var v = "Hello World!"; v = 10; System.Console.WriteLine(v); } }
3.引用类型 和 值类型
System.String虽然是引用类型(Reference Types),但他显示出来的特性很像值类型,而System.Array就不一样了,是标准的引用类型的表现执行下面的代码:
static void Main() { var stringValue = "Hello World!"; var stringValue2 = stringValue; stringValue = "Hello Austria!"; System.Console.WriteLine(stringValue2); var array = new[] { 1, 2, 3, 4 }; var array2 = array; array[0] = 99; System.Console.WriteLine(array2[0]); }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
结果应该是
Hello Wrold!
99
4.Finalizing Objects
像c++一样,c#的类在解构函数中释放资源是很好的方法,但这还不是足够的。看下面的代码:internal class FileGenerator : IDisposable { public FileGenerator() { } ~FileGenerator() { // Just a debug output Console.WriteLine("Closing file!"); } public void Generate(int Length) { // Here some work is done... } public void Dispose() { // Just a debug output Console.WriteLine("Disposing object!"); } } class Program { static void Generate() { using ( var fGen = new FileGenerator() ) fGen.Generate(512); } static void Main(string[] args) { Generate(); // Here we do some work; simulated by ReadLine statement Console.Write("Please Press Enter..."); Console.ReadLine(); } }
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
我们可以发现,"Closing file!",每次都要等到程序退出时才执行,解构函数是有.net框架的垃圾收集器调用的,什么时候调用,我们是不能控制的,所以如果需要手工控制资源释放的时候,我们需要从接口IDisposable继承一个类,然后重写Dispose(),在代码中使用using语句,这样程序将立即自动调用Dispose()的执行。
5.Nullable 类型
看下面的代码static void Main() { int a = 10; int? b = 20; int? c = null; System.Console.WriteLine(a + c ?? b); System.Console.Read(); }
上面的结果是20
在c#中可以给所以的值定义Nullable类型,就是在类型前加上一个问号。两个问号??操作符 是和?配套使用的,当Nullable的值为null时,就会默认取??后面的值,
代码中c为null,所以a+c也为null,这样就会取b值,就是20
.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }
相关文章推荐
- 关于iOS push一些问题的理解
- 关于hibernate的关系映射的问题一些理解和笔记
- 关于dll及跨语言调用的问题的一些理解
- 关于把.net 2.0的项目升级到.net4.0遇到的一些问题
- 关于编码问题,自己的一些理解
- 关于.net Enumerable的一些方法的理解
- 关于P类问题,NP问题,NPC问题的一些粗浅理解
- 关于 .net 开发 Office Word 的一些问题小结
- 037 关于pom.xml的一些问题的理解
- 关于背包问题的一些理解和应用
- 关于在.net环境下通过使用LDAP来访问AD,LDAPServer的一些问题?
- 关于.Net中一些名词的理解
- 关于tipsWindown弹出层的一些使用问题
- 关于js和jquery的一些问题
- 关于VIM使用的时候一些格式问题
- 关于mybaties中的一些小问题(不定时更新)
- C语言中关于INT_MIN宏的一些问题
- 关于拉格朗日对偶问题中对偶性的理解
- 关于cocoaPods 创建和一些解决问题
- 关于sqlMap中的一些小问题