搜尋
首頁类库下载java类库Java進擊C#-語法之知識點的改進

一、類別的初始化方式。類別初始化的時候,增加了初始化屬性值功能。如下代碼。

以前的:

  Person person = new Child();
  person.Name = "Aomi";
  person.Move();

新的:

 Person person = new Child()
 {
    Sex = "男",
    Name = "Aomi"
 };
 person.Move();

二、集合類別的初始化方式。集合類別的初始化不在是以前的單調方式了。可以在初始化的時候,一起增加一些值了。

以前的:

List<string> strList = new List<string>();
strList.Add("a");
strList.Add("b");
strList.Add("c");

新的

List<string> strList = new List<string>() { "a", "b", "c" };

關鍵字var的引入    

前面幾章中我們常用的類型都是強類型。如果你們有用過Javascript語言的話,相信應該要明白關於弱型別和強型別。簡單點講弱型別就是類型在定義的時候很難確定。只有在運行的時候才會知道他是什麼類型的。 C#是一門強型別的語言,也就是說在編譯的時候就必須知道定義是什麼類型的資料。然而C#卻在這一點上讓筆者很不理解。為什麼這樣子講呢?看一下下面的一段程式碼吧。

var local = 1;

這段程式碼是一個定義一個.....。好吧。筆者也不清楚應該什麼講。有相關的資料是這樣子講的。他不是沒有類型。也不是一個var類型的。可是編譯的時候就會確定他是什麼類型。就是上面的程式碼編譯的時候就是確定他是int型的。如下面圖

Java進擊C#-語法之知識點的改進

看到上面的圖片裡面的提示沒有。他是一個局部變數int local。很明確定的說明他是int型別。筆者在開發的過程中並沒有遇到過必須要用var關鍵字來宣告變數的時候。所以筆者心中面一直不懂──這個到底什麼時候用。這個地方有一點語法要注意。剛才講到C#是強型別語言。所以var關鍵字必須在定義的時候就給也初始化的值。

由於有var關鍵字的引入,同時出現了一種聲明類別的寫法。許多書本叫他們為匿名類型。如下代碼

var student = new 
 { 
    Name="aomi",
    SNO="s0001"};

關鍵字dynamic的引入    

筆者上面講到C#是一門強類型的語言。關鍵字var的引入真的很難理解。如果筆者說他是弱型,好像跟C#有一不對頭。如果說他是強類型又沒有var這種類型。筆者我是不懂。也許可能就是這個原因C#在4.0的時候就引入關鍵字dynamic。有一個全新的概念叫做動態型別。那什麼是動態型別呢?我們先按上面的關鍵字var一樣子的做法來看一下他編譯的時候會是出現什麼樣子類型吧。如圖下

Java進擊C#-語法之知識點的改進

看樣子在編譯的時候還是dynamic型。看樣子是真的有動態型別。當然關是這樣子可不行。我們還要看一下他運行時候的樣子。隨便看一下visual studio是如何調試的。

先設定斷點吧。只要編寫器(即寫程式碼的地方)的最左邊上點選就可以出現紅色的圓點。那個便是斷點。 eclipse好像有右鍵選擇設定斷點。可惜visual studio卻沒有,只有在你寫程式碼的區域右鍵設定斷點。請讀者們自己試試看。

Java進擊C#-語法之知識點的改進

斷點設定成功之後,啟動(Debug模式)程式碼。這時候我們就可以監控要查看的變數。先擇對應的變數右鍵。如下

Java進擊C#-語法之知識點的改進

當點擊「新增監控(W)」的時候,就會彈出對應的監控窗體。下面是筆者把對應的窗體拉出來。

Java進擊C#-語法之知識點的改進

好了。接下便是如何讓他下一步下一步的執行了。在visual studio的頂部會出現下面圖片的工具按扭。

Java進擊C#-語法之知識點的改進

F5:啟動

F10:下一步。相當於eclipse的F5。

F11:進行內部程式碼。相當於eclipse的F6。

Shift+F11:跳出。相當於eclipse的F7。

好了。相信大家們應該會調試了吧。讓我們進入正題。從上面的監控窗體裡面我們可以看到變數student狀態。類型為dynamic{int}。這樣子我們就可以明白了。動態型別就是在運作的時候確定的型別。

關鍵字dynamic跟關鍵字var不一樣子的是因為真的有dynamic類型。所以定義的時候可以不用初始化。他對應的類型可以在運行的時候進一步確定。大家不耐煩去試試。

C#:

dynamic student = 1l;

if (student is int)
{
     Console.WriteLine("int类型");
}
else if (student is long)
{
    Console.WriteLine("long类型");
}

參數的改變    

我們都清楚早期的方法是沒有對應的預設值的。而且必須按照定義好的順序進行傳值的。 C#在這裡方面做了一些改變。

public static void mothed(string a,string b = "bbb")
{
}

我们可以看到代段里面参数string b = "bbb"上面的改变了。这就意味着在调用mothed这个方法的时候,可以不给参数b传值。他会用默认的值:bbb。但是参数a就必须传了。代码如下

第一种用法:这个时候参了的值是默认值(bbb).

 mothed("aaa");

第二种用法:这跟以前的用法一样子。

mothed("aaa","ccc");

第三种用法:这新是一种用法。不用当然顺序的问题了。

mothed(b:"ccc",a:"a");

方法上的改变    

不管是JAVA还是C#都有定义事件这个概念。那么C#是什么样子定义事件呢?

1.首先要用到关键字delegate声明该事件的委托类型。即是用于表示将来要发生事件的结构是什么。如要回返什么类型。会传入什么样子的参数类型。有几个参数。这些都可以开发人员自己定义。包括委托类型的名字。

 public delegate void MoveHandler(object obj);

注意上面的代码可以独立一个cs文件来存放他。跟类的代码存放的级别一样子。

2.定义好了委托类型之后,我们就可以根据这个委托类型来声明对应的事件。关键字event就是表示当前为事件的意思。然后在Move方法触发对应的事件。判断事件是不是空的。如果不是就触发事件。

C#:

public class Child : Person
    {
        public event MoveHandler ChildMoveHandler;
        public Child()
            : base("Aomi")
        {
 
        }
        public override void Move()
        {
            if (ChildMoveHandler != null)
                ChildMoveHandler(this);
        }
    }

3.有了上面的代码的声明之后,我们就可以试用一下C#的事件了。如下面的代码。在child变量调用Move方法之前。笔者就给他初始化一个事件。这个时候他在调用Move方法,判断事件不为空就把自己传给了这个事件做为参数。而下面的事件代码(Child_ChildMoveHandler方法)里面会把对应的obj通过as功能转化为Child类的变量。在打印出名字来。请一定要注意给事件赋值的时候要用"+="。即是增加事件不是赋值哦。相反"-="表示删除事件。

C#:

class Program
    {
        static void Main(string[] args)
        {
            Child child = new Child();
            child.ChildMoveHandler += Child_ChildMoveHandler;
            child.Move();
        }

        public static void Child_ChildMoveHandler(object obj)
        {
            Child src = obj as Child;
            Console.WriteLine(src.Name);
        }
        
    }

对于上面的三个步骤是以前的用法。现在有了新用法。引入了关键字Action的用法。简单来讲就传递方法了。以前只能传递变量或是对象。现在方法也可以传递了。事件声明就变得很简单了。

C#:

public class Child : Person
    {
        public event MoveHandler ChildMoveHandler;
        public event Action<object> ChildActionMoveHandler;
        public Child()
            : base("Aomi")
        {
 
        }
        public override void Move()
        {
            if (ChildMoveHandler != null)
                ChildMoveHandler(this);
            if (this.ChildActionMoveHandler != null)
                this.ChildActionMoveHandler(this);

        }
    }

对于上面的三个步骤是以前的用法。现在有了新用法。引入了关键字Action的用法。简单来讲就传递方法了。以前只能传递变量或是对象。现在方法也可以传递了。事件声明就变得很简单了。

C#:

public class Child : Person
    {
        public event MoveHandler ChildMoveHandler;
        public event Action<object> ChildActionMoveHandler;
        public Child()
            : base("Aomi")
        {
 
        }
        public override void Move()
        {
            if (ChildMoveHandler != null)
                ChildMoveHandler(this);
            if (this.ChildActionMoveHandler != null)
                this.ChildActionMoveHandler(this);

        }
    }

使用的方式还是不变得。如下代码

class Program
    {
        static void Main(string[] args)
        {
            Child child = new Child();
            child.ChildMoveHandler += Child_ChildMoveHandler;
            child.ChildActionMoveHandler += Child_ChildActionMoveHandler;
            child.Move();
        }

        public static void Child_ChildActionMoveHandler(object obj)
        {
            Child src = obj as Child;
            Console.WriteLine(src.Name);
        }

        public static void Child_ChildMoveHandler(object obj)
        {
            Child src = obj as Child;
            Console.WriteLine(src.Name);
        }
        
    }

看吧。事件的定义变得很简单了。只是对于Action的用法。可能还是一点不了解。Action这个是什么意思呢?很简单就是说Action他可以实现方法传递。只是可惜只能控制参数的类型和个数却不能控制返回类型。也是就说返回类型只能是void类型。那么控制返回的类型的话,不好意思请改用另一个关键字Func。这个时候就可以控制返回类型。只是不能用void作为返回类型了。代码如

public class Child : Person
    {
        public event MoveHandler ChildMoveHandler;
        public event Func<object,int> ChildFuncMoveHandler;
        public Child()
            : base("Aomi")
        {
 
        }
        public override void Move()
        {
            if (ChildMoveHandler != null)
                ChildMoveHandler(this);
            if (this.ChildFuncMoveHandler != null)
                this.ChildFuncMoveHandler(this);

        }
    }

执行代码:

class Program
    {
        static void Main(string[] args)
        {
            Child child = new Child();
            child.ChildMoveHandler += Child_ChildMoveHandler;
            child.ChildFuncMoveHandler += Child_ChildFuncMoveHandler;
            child.Move();
        }

        public static int Child_ChildFuncMoveHandler(object obj)
        {
            Child src = obj as Child;
            Console.WriteLine(src.Name);
            return 0;
        }

        public static void Child_ChildMoveHandler(object obj)
        {
            Child src = obj as Child;
            Console.WriteLine(src.Name);
        }
        
    }

显然不管是用Action关键字还是用Func关键字都是对方法的操作。但是在事件的声明上却变得更加的可读和简单了。至少不用在写声明委托类型了。既然对方法的操作。是不是可以这样了讲Action和Func可以定义为一个类内部的成员变量。当然可以。

public class Mothed
    {
        public Func<string, int> PrintFunc;
        public Action<string> PrintAction;

        public void Execute()
        {
            this.PrintFunc("PrintFunc aomi");
            this.PrintAction("PrintAction aomi");
        }
    }

看看执行代码吧

class Program
    {
        static void Main(string[] args)
        {
            Mothed mothed = new Mothed();
            mothed.PrintAction = PrintAction;
            mothed.PrintFunc = PrintFunc;
            mothed.Execute();
        }
        public static int PrintFunc(string value)
        {
            Console.WriteLine(value);
            return 0;
        }
        public static void PrintAction(string value)
        {
            Console.WriteLine(value);
        }
    }

很重要的一点:上面的事件是用“+=”,现在是用"="。即是赋值的意思了。

我们可以看到C#在把方法也变成一个可以使用的变量了。正因为这样子,在方法的赋值上出现俩种的方式写法。让我们看一下吧。

1.匿名方法赋值。

class Program
    {
        static void Main(string[] args)
        {
            Mothed mothed = new Mothed();
            mothed.PrintAction = delegate(string value)
            {
                Console.WriteLine(value);
            };
            mothed.PrintFunc = delegate(string value)
            {
                Console.WriteLine(value);
                return 0;
            }; 

            mothed.Execute();
        }
    }

2.lambda表达式赋值。

class Program
    {
        static void Main(string[] args)
        {
            Mothed mothed = new Mothed();
            mothed.PrintAction = (string value)=>
            {
                Console.WriteLine(value);
            };
            mothed.PrintFunc = (string value)=>
            {
                Console.WriteLine(value);
                return 0;
            }; 

            mothed.Execute();
        }
        
    }

本章总结    

本章主要是讲到关于C#在语法上引入的一些新的特性。其中有一些还是值得我们去注意的。特别事件声明用的action和func。其次便是参数上的变化。这个笔者在开发过程也常常会用到。


陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具