Java进击C#——语法之知识点的改善

本章简言

达成同一章我们说话到关于面向对象思想上C#与JAVA之别。笔者分别于面向对象的老三杀特征入手。而本章主要出口有C#精益求精的知识点。在.NET
Framework
2.0后出现群初的知识点。这些知识点更是让C#在写法上越来越的多样性。有些写法还当真叫笔者以为很有科学。由于这同一片段的学识重新多是C#独有的。很有麻烦用JAVA这边的知来讲。所以马上回可能会见纯C#了。虽然在JAVA
7 和JAVA 8中出现群特色。可惜笔者也从没当真的攻一下初特色。

初始化语法的改进

一如既往、类的初始化方式。类初始化的时段,增加了初始化属性值功能。如下代码。

以前的:

  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类型的。如下面图片

C# 1

看来地方的图片中的提示无。他是一个片段变量int
local。很明确定的认证外是一个int类型。笔者在付出的进程中并无遇到了要要为此var关键字来声称变量的时段。所以笔者心中面一直无知情——这个到底什么时用啊。这个地方发好几语法要注意。刚才讲到C#举凡强类型语言。所以var关键字必须在概念之时光就是叫啊初始化的价。

由有var关键字的引入,同时起了同种声明类的写法。许多书叫他们吧匿名类型。如下代码

var student = new 
 { 
    Name="aomi",
    SNO="s0001"
};
关键字dynamic的引入

笔者上面说到C#大凡同一山头强类型的语言。关键字var的引入真的特别麻烦知晓。如果笔者说他是弱类型,又象是跟C#起同一免投缘。如果说他是强类型又无var这种类型。笔者自我是未理解。也许可能就是者由C#每当4.0之当儿就是引入关键字dynamic。有一个簇新的定义让作动态类型。那么什么是动态类型也?我们事先随上面的重要性字var一样子的做法来拘禁一下他编译的时候会是起啊体统类型吧。如图下

C# 2

总的来看在编译的当儿要dynamic类型。看样子是真正的生动态类型。当然关是这样子可深。我们还要看一下他运行时刻的榜样。随便扣留一下visual
studio是如何调节之。

事先安装断点吧。只要编写器(即是形容代码的地方)的极度左边上点击即可起红色的圆点。那个不畏是断点。eclipse好像发出右击在甄选设置断点。可惜visual
studio却无,只有当您写代码的区域右击设置断点。请读者们团结摸索。

C# 3

断点设置成后,启动(Debug模式)代码。这个时咱们就算好监控要翻开的变量。先择对应的变量右击。如下

C# 4

当点击“添加监控(W)”的上,就会弹有相应的督查窗体。下面是笔者把相应的窗体拉出。

C# 5

哼了。接下便是什么吃他生一样步下一致步的施行了。在visual
studio的顶部会产出下面图片的工具按扭。

C# 6

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

        }
    }

行使的方式尚是免更换得。如下代码

    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<T
in >这个是什么意思为?很简短就是说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关键字都是对准法的操作。但是在波的声明C#上可变得愈的可读和概括了。至少不用在写声明委托项目了。既然对章程的操作。是匪是足以这么了讲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。其次就是是参数上之生成。这个笔者在付出过程吧时不时会就此到。

相关文章