>  기사  >  백엔드 개발  >  C#의 익명 개체, var 및 동적 유형 동적에 대한 자세한 설명

C#의 익명 개체, var 및 동적 유형 동적에 대한 자세한 설명

黄舟
黄舟원래의
2017-09-06 13:53:032534검색

C#의 발전으로 언어의 내용은 계속해서 풍부해지고, 개발은 더욱 편리해지고 빨라지며, C#의 예리함은 의심할 여지 없이 드러납니다. C# 언어는 탄생부터 강력한 형식의 언어였습니다. 이러한 성격은 오늘날에도 변하지 않았고 앞으로도 변하지 않을 것이라고 생각합니다. 강력한 유형의 언어이므로 작성된 모든 프로그램은 다음 기본 조건을 충족해야 합니다.

1. 변수 선언은 해당 유형을 나타내야 합니다.

2. 변수 유형이 지워진 후에는 런타임 중에 해당 유형을 변경할 수 없습니다. 코드는 다음과 같습니다.

    public  class Student
    {        
    public string Name { get; set; }        
    public int Age { get; set; }        
    public string Like { get; set; }
    }
static void Main(string[] args)
{    int a = 10;    string s = "abc";
    Student student = new Student();    //下面出现编译错误,变量类型在声明后无法再变更
    s = a;
    student = s;
    a = 10.1f;
}

그러나 실제 개발에서는 다음과 같은 일반적인 문제에 직면하는 경우가 많습니다.

1. 대규모 프로그램에서는 특정 또는 극소수(3개 이하)만 존재합니다. 다른 곳에서는 더 이상 필요하지 않은 특정 유형(예: 위의 Student) Student 유형을 별도로 선언하려면 이 유형을 사용할 때 필요한 코드의 양이 코드의 양을 초과할 수 있으며 투자 산출 비율이 비용 효율적이지 않습니다.

2. 프로그램에서는 특정 유형의 개체의 일부 속성이나 메서드만 작업에 참여해야 합니다. 이 경우 이러한 유형의 개체를 프로그램에 필요한 일부 속성과 메서드를 포함하는 개체로 일시적으로 변환하면 프로그램을 더욱 간소화할 수 있습니다.

3. 다른 상황... 아직 눈치채지 못했습니다... 추가해 주셔서 감사합니다...

C# 실제 개발에서 위의 일반적인 문제, JavaScript 개발에서 다음과 같은 더 나은 솔루션이 있습니다.

//在此处js中需要模拟一个学生对象
student = {"name":"张三","age":20,"like":"LOL"};
//在此处js中需要模拟一个老师对象
teacher = {"name":"李老师","like":"没收学生手机,自己LOL"};
//此处需要将学生student转换成只有name和age的对象
person = {"name":student.name,"age":student.age};

위의 js 구문이 익숙하지 않은 경우 Baidu에 가서 "json 구문"을 검색하면 매우 간단하고 중요하다는 것을 알려드립니다.

익명 객체(익명 유형)

그래서 C#은 버전 3.0에서 JavaScript 스크립팅 언어의 문법적 장점을 흡수하고 이에 따라 C#을 업그레이드하여 이 문법 형식을 지원합니다(

C#은 여전히 ​​강력한 형식의 언어입니다

). 샘플 코드는 다음과 같습니다.

static void Main(string[] args)
{     new {Name="张三",Age=20,Like="LOL"};
}
위의 C# 코드는 new 키워드를 사용하여 컴파일러에 개체를 생성하도록 지시합니다. 개체에는 Name, Age 및 Like라는 세 가지 속성이 있고 그 뒤에 =와 해당 속성 값이 옵니다. . 이런 식으로 우리는

"객체를 생성하려면 먼저 객체 유형의 제약이 있어야 합니다",

따라서 개발 과정에서 덜 사용되는 유형에 대해 더 이상 별도의 클래스를 생성할 필요가 없으며 위에서 언급한 문제 1이 해결됩니다 . 지금 생성된 개체는 특정 유형을 지정하지 않으므로

익명 개체

라고 합니다.

Var이 여기에 있습니다

이제 익명 개체를 사용하려면 변수를 사용하여 이를 참조해야 합니다. 객체를 생성할 때 객체의 유형을 지정하지는 않지만 컴파일러는 컴파일 프로세스 중에 관련 속성과 메서드를 사용하여 유형을 생성하는 데 도움을 줍니다. 이때 컴파일된 타입명은 무작위로 생성된 것이므로 변수 타입을 판별할 수 없다. 예는 다음과 같습니다.

static void Main(string[] args)
{    //XXX为类型声明    //x为引用变量 
     XXX x = new {Name="张三",Age=20,Like="LOL"};
}

컴파일러가 생성한 유형 이름은 모르지만

컴파일러가 컴파일 결과를 기반으로 변수 유형을 추론하도록 할 수 있습니다.

이때 var 키워드가 사용됩니다:

static void Main(string[] args)
{     var x = new {Name="张三",Age=20,Like="LOL"};
}
var 키워드는

var 사용 시 주의사항:

1 var는 메소드 내에서만 로컬 변수를 선언할 수 있음을 설명합니다

2 var에 의해 선언된 변수의 유형은 할당된 후에 결정되며 이후 프로그램에서 다른 유형을 할당할 수 없습니다.

3.var x = new object() 값은 의미가 없습니다. 그러한 코드를 작성하지 마십시오. .............

이제 익명 객체와 var가 있습니다. 추론 유형을 지원하면 위에서 언급한 문제 2를 처리할 수 있습니다. 샘플 코드는 다음과 같습니다.

        static void Main(string[] args)
        {            
        var x = new { Name = "张三", Age = 20, Like = "LOL" };            
        var s = new { Name = x.Name, Age = x.Age };  
        }

위는 단지 예시일 뿐입니다. Linq나 Entity Framework에 익숙하신 분들이라면 2번 질문에 해당하는 사용법이 부담스러울 것입니다...

동적 유형의 동적이 나타납니다

For 익명 유형의 사용은 일반적으로 메소드의 로컬 부분으로 제한됩니다. 이는

로 이해될 수 있습니다. 사용하는 대로 정의되고 사용 후에는 사라집니다.

다음 상황에서는 어떻게 해야 하나요?

        static void Main(string[] args)
        {            
        var x = GetObject(); 
        }        
        private static XXX GetObject()
        {            
        return new { Name = "张三", Age = 20, Like = "LOL" };
        }
익명의 개체는 GetObject 메서드를 통해 반환되므로 메서드 반환 값 유형 이름을 확인할 수 없으며 여기서는 일시적으로 XXX로 대체됩니다. 이 경우 반환 유형은 정의되지 않으며 동적을 사용하여 지정할 수 있습니다. 다음과 같습니다:
          Main( x =    { Name = , Age = , Like =

현재 메소드에는 구문 오류가 없으며 프로그램이 성공적으로 컴파일되고 실행될 수 있습니다. 그렇다면 위 프로그램을 성공적으로 컴파일하기 위해 동적이 정확히 무엇을 하는가?


동적의 역할:

1. 동적 유형의 의미는 프로그램 작성 및 컴파일 단계에서 해당 개체의 속성이나 메서드가 결정된다는 것입니다. 반사 메커니즘. 따라서 쓰기 단계에서는 구문 검사가 수행되지 않습니다.

2. Dynamic은 필드, 속성, 메서드 매개 변수 및 메서드 반환 값을 선언하는 데 사용할 수 있습니다.

3. Dynamic은 코드를 작성할 때(리플렉션) 무엇인지 알 수 없기 때문에 스마트 프롬프트를 지원하지 않습니다.

동적 선언 변수는 객체 유형 변수로 이해될 수 있습니다. 따라서 동적 변수에 모든 유형의 값을 할당하는 것이 옳습니다. 그러나 변수를 사용하여 속성 값을 얻거나 메서드를 호출하는 경우(이 시점에서 프로그램은 런타임 상태에 있어야 함) CLR은 ( 반영) 호출된 속성이나 메서드가 존재하는지 여부에 따라 런타임 예외가 보고되지 않습니다.

dynamic은 Asp.net Mvc 웹 개발의 모든 곳에서 사용됩니다. 복잡해 보이지만 위에서 언급한 내용이 핵심입니다.

설명:

var와dynamic은 비슷한 기능을 가진 것 같지만 다릅니다.

지역 변수 √ √ 메소드 매개변수 유형 × √ 메소드 반환 값 유형

위 내용은 C#의 익명 개체, var 및 동적 유형 동적에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.