关于C#3.0和.net一些问题的理解

简介:

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]);
        }

结果应该是

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();
        }
    }

我们可以发现,"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

路漫漫其修远兮 吾将上下而求索


本文转自 lu xu 博客园博客,原文链接:http://www.cnblogs.com/dotLive/archive/2008/02/02/1062710.html   ,如需转载请自行联系原作者


相关文章
|
7天前
|
Java 物联网 C#
C#/.NET/.NET Core学习路线集合,学习不迷路!
C#/.NET/.NET Core学习路线集合,学习不迷路!
|
1月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
10天前
|
Java 物联网 编译器
C#一分钟浅谈:.NET Core 与 .NET 5 区别
本文对比了 .NET Core 和 .NET 5,从历史背景、主要区别、常见问题及易错点等方面进行了详细分析。.NET Core 侧重跨平台支持和高性能,而 .NET 5 在此基础上统一了 .NET 生态系统,增加了更多新特性和优化。开发者可根据具体需求选择合适的版本。
32 7
|
7天前
|
人工智能 开发框架 前端开发
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
|
7天前
|
开发框架 网络协议 .NET
C#/.NET/.NET Core优秀项目和框架2024年10月简报
C#/.NET/.NET Core优秀项目和框架2024年10月简报
|
6天前
|
人工智能 开发框架 安全
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
|
7天前
|
网络协议 Unix Linux
精选2款C#/.NET开源且功能强大的网络通信框架
精选2款C#/.NET开源且功能强大的网络通信框架
|
7天前
|
程序员 C# 图形学
全面的C#/.NET自学入门指南
全面的C#/.NET自学入门指南
|
30天前
|
JSON C# 开发者
C#语言新特性深度剖析:提升你的.NET开发效率
【10月更文挑战第15天】C#语言凭借其强大的功能和易用性深受开发者喜爱。随着.NET平台的演进,C#不断引入新特性,如C# 7.0的模式匹配和C# 8.0的异步流,显著提升了开发效率和代码可维护性。本文将深入探讨这些新特性,助力开发者在.NET开发中更高效地利用它们。
34 1
|
1月前
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
59 8