> 类库下载 > java类库 > Java 공격 C# - 구문 지식 포인트 개선

Java 공격 C# - 구문 지식 포인트 개선

高洛峰
풀어 주다: 2016-10-14 17:21:46
원래의
1839명이 탐색했습니다.

1. 클래스 초기화 방법. 클래스가 초기화되면 속성값을 초기화하는 기능이 추가됩니다. 다음 코드.

이전:

  Person person = new Child();
  person.Name = "Aomi";
  person.Move();
로그인 후 복사

신규:

 Person person = new Child()
 {
    Sex = "男",
    Name = "Aomi"
 };
 person.Move();
로그인 후 복사

2. 컬렉션 클래스의 초기화 방법. 컬렉션 클래스의 초기화는 더 이상 예전처럼 단조로운 방식이 아닙니다. 초기화 중에 일부 값을 함께 추가할 수 있습니다.

이전:

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 키워드 소개

이전 장에서 자주 사용하는 유형은 모두 강력합니다. 입력했습니다. 자바스크립트 언어를 사용해보신 분들이라면 약한 타이핑(Weak Typing)과 강한 타이핑(Strong Typing)에 대해 이해하셔야 할 것 같습니다. 간단히 말해서 약한 유형 지정이란 유형이 정의될 때 유형을 결정하기 어렵다는 것을 의미합니다. 실행할 때만 그것이 어떤 유형인지 알 수 있습니다. C#은 강력한 형식의 언어입니다. 즉, 컴파일할 때 어떤 형식의 데이터가 정의되어 있는지 알아야 합니다. 그러나 C#은 이 점에서 혼란스럽습니다. 왜 이렇게 말해요? 다음 코드를 살펴보세요.

var local = 1;
로그인 후 복사

이 코드는 정의입니다... 괜찮은. 글쓴이도 무슨 말을 해야할지 모르겠습니다. 이와 관련된 관련 정보가 있습니다. 그는 유형이 없는 사람이 아닙니다. var 유형도 아닙니다. 하지만 어떤 유형인지는 컴파일할 때 결정됩니다. 위의 코드를 컴파일하면 int 유형인 것으로 확인됩니다. 예를 들어 아래 그림

Java 공격 C# - 구문 지식 포인트 개선

에서 위 그림의 프롬프트를 볼 수 있습니다. 지역 변수 int local입니다. int형임을 확실히 알 수 있습니다. 개발 과정에서 작성자는 변수를 선언하기 위해 var 키워드를 사용해야 하는 필요성을 전혀 경험하지 못했습니다. 그러므로 저자는 내 마음 속으로 이해하지 못했습니다. 언제 사용해야합니까? 여기서 주의해야 할 약간의 구문이 있습니다. 방금 C#이 강력한 형식의 언어라고 언급했습니다. 따라서 var 키워드는 정의 시 초기화된 값을 제공해야 합니다.

var 키워드의 도입으로 인해 클래스 선언을 작성하는 방식도 등장했습니다. 많은 책에서는 이를 익명 유형이라고 부릅니다. 다음 코드

var student = new 
 { 
    Name="aomi",
    SNO="s0001"};
로그인 후 복사

에서는 동적 키워드를 소개합니다.

저자는 C#이 강력한 형식의 언어라고 위에서 언급했습니다. var 키워드의 도입은 정말 이해하기 어렵습니다. 작성자가 약한 타입이라고 하면 C#에 뭔가 문제가 있는 것 같습니다. 강력한 유형이고 var 유형이 없는 경우. 모르겠어요. 아마도 이것이 C#이 4.0에서 동적 키워드를 도입한 이유일 것입니다. 동적 타이핑이라는 새로운 개념이 있습니다. 그렇다면 동적 유형이란 무엇입니까? 먼저 위의 var 키워드와 동일한 방법을 사용하여 컴파일 시 어떤 타입이 나타날지 살펴보겠습니다. 아래 그림과 같이

Java 공격 C# - 구문 지식 포인트 개선

는 컴파일시에는 동적형인 것으로 보입니다. 실제로 동적 유형이 있는 것 같습니다. 물론 이렇게는 작동하지 않습니다. 우리는 또한 달릴 때 어떻게 보이는지 살펴볼 필요가 있습니다. Visual Studio가 디버깅하는 방법을 살펴보세요.

먼저 중단점을 설정하세요. 작성기의 가장 왼쪽(즉, 코드를 작성하는 곳)을 클릭하면 빨간색 점이 나타납니다. 그것이 중단점입니다. Eclipse에는 중단점을 설정하는 마우스 오른쪽 버튼 클릭 옵션이 있는 것 같습니다. 안타깝게도 Visual Studio에는 코드를 작성하는 영역을 마우스 오른쪽 버튼으로 클릭해야만 중단점을 설정할 수 있습니다. 독자 여러분, 직접 시도해 보시기 바랍니다.

Java 공격 C# - 구문 지식 포인트 개선

중단점이 성공적으로 설정되면 (디버그 모드) 코드를 시작합니다. 이때 우리가 보고 싶은 변수를 모니터링할 수 있습니다. 먼저 해당 변수를 선택하고 마우스 오른쪽 버튼을 클릭합니다. 다음과 같습니다

Java 공격 C# - 구문 지식 포인트 개선

'모니터링 추가(W)'를 클릭하면 해당 모니터링 양식이 팝업됩니다. 아래는 작성자가 해당 양식을 꺼내는 모습입니다.

Java 공격 C# - 구문 지식 포인트 개선

알겠습니다. 다음 단계는 그를 다음 단계로 나아가게 하는 방법입니다. 아래 표시된 도구 단추는 Visual Studio 상단에 나타납니다.

Java 공격 C# - 구문 지식 포인트 개선

F5: 시작

F10: 다음 단계입니다. Eclipse의 F5와 동일합니다.

F11: 내부 코드를 실행합니다. Eclipse의 F6과 동일합니다.

Shift+F11: 뛰어내립니다. Eclipse의 F7과 동일합니다.

알겠습니다. 나는 모든 사람이 그것을 디버깅할 수 있어야 한다고 믿습니다. 사업을 시작합시다. 위의 모니터링 양식을 통해 다양한 학생 현황을 확인할 수 있습니다. 유형은 동적{int}입니다. 이렇게 하면 우리는 이해할 수 있습니다. 동적 유형은 런타임에 결정되는 유형입니다.

dynamic 키워드는 var 키워드와 다릅니다. 실제로는 동적 유형이 있기 때문입니다. 따라서 정의할 때 초기화할 필요가 없습니다. 해당 유형은 런타임 시 추가로 결정될 수 있습니다. 굳이 시도하지 마세요.

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。其次便是参数上的变化。这个笔者在开发过程也常常会用到。


원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿