C# 고급 프로그래밍(3) - 개체 및 유형에 대한 자세한 설명

黄舟
풀어 주다: 2017-03-20 13:33:14
원래의
1129명이 탐색했습니다.

3.2 클래스와 구조체

클래스와 구조체의 차이점은 메모리에 저장하는 방식 , 액세스 방법(힙에 저장된 참조 유형과 유사하지만 구조는 스택에 저장된 값 유형) 및 해당 일부 특성.

구문상 클래스는 구조체와 매우 유사합니다. 주요 차이점은 구조체가 struct 키워드를 사용한다는 것입니다. class 대신 선언되었습니다.

3.3 클래스 멤버

3.3.1 데이터 멤버

데이터 멤버에는 클래스 데이터가 포함됩니다. 필드, 상수이벤트 회원들.

 3.3.2 함수멤버

  함수 멤버는 메서드, 속성, 생성자소멸자 함수(터미네이터) ) , 연산자인덱서.


    1. 방법

ref out 의 차이점:

ref 는 통과하기 전에 초기화되어야 하며, out 은 필요하지 않습니다.

ref 의 핵심은 값 유형을 참조로 전달하는 반면 out 는 반환 값을 늘리는 것입니다.

명명된 매개변수: 매개변수를 전달하는 과정에서 이름을 지정할 수 있으며 형식은 MethodName(ParameterName: Value)

Params 키워드: 메소드 매개변수 끝에 와야 합니다.

메소드 오버로딩:

ref , 선언에 따른 차이가 아닌 반환 유형에만 차이가 있을 수 없습니다. out 또는 params 를 구별하세요.


    1. 속성

개념: 속성은 클라이언트 코드의 관점에서 보면 하나의 메서드 또는 메서드 쌍입니다.

get 접근자는 매개변수를 사용하지 않고 속성에서 선언한 유형을 반환합니다.

set 접근자는 선언된 유형과 동일한 유형의 값 매개변수를 사용합니다.

속성의 액세스 한정자: get 및 set 접근자에는 속성에 대한 액세스 수준이 있어야 합니다.


    1. 생성자

선언적 생성 방법은 포함하는 클래스와 동일한 이름을 가진 메서드를 선언하지만 해당 메서드에는 반환 값이 없습니다.

매개변수가 포함된 생성자가 제공되면 컴파일러는 자동으로 기본 생성자를 제공하지 않습니다.

     (1) 정적 생성자

                                                logue 클래스를 처음 사용하기 전에 외부 소스에서 이러한 필드와 속성을 초기화합니다.

.NET 런타임 라이브러리는 언제 정적 생성자를 실행할지 보장하지 않으므로 특정 시간에 정적 생성자의 코드를 실행할 필요가 없습니다. 그러나 보장되는 것은 모든 참조 전에 한 번만 호출된다는 것입니다.

매개변수 없는 생성자는 정적 생성자와 동일한 클래스에 정의할 수 있습니다.

(2) 생성자

base 에서 다른 생성자를 호출합니다. 이 키워드

 3.3.3 읽기 전용 필드

  읽기 전용 의 차이점 const :

 readonly 를 생성자에 할당할 수 있으며 const 는 어디에도 할당할 수 없으며 초기화만 가능합니다.

3.4 익명 유형

 var 예를 들어 새로운 키워드를 함께 사용하여 익명 유형을 만들 수 있습니다.

static void Main(string[] args)
 2 
 3 
 4         {
 5 
 6 
 7             var test = new { Name = "Earl Jones", Age = 17 };
 8 
 9 
10             Console.WriteLine(test.ToString());
11 
12 
13             Console.WriteLine(test.Name.GetType().ToString());
14 
15 
16             Console.WriteLine(test.Age.GetType().ToString());
17 
18 
19             Console.ReadKey();
20 
21 
22         }
复制代码
로그인 후 복사

출력은 다음과 같습니다.

🎜>객체 유형, 컴파일러는 해당 이름을 "가짜"로 지정합니다. , 그러나 컴파일러만이 이를 사용할 수 있으며, 일관된 결과를 제공하지 않기 때문에 새 객체에 대한 유형 리플렉션을 사용할 수도 없고 사용해서도 안 됩니다.

3.5 구조

구조는 참조 유형이 아닌 값 유형이며, 라이프사이클

의 제한 사항은 단순
    데이터 유형
  • 과 동일하게 구조 전달 시 ref 키워드를 사용하여 성능 손실을 줄일 수 있습니다.

    구조는 일반적으로 단순 결합 데이터를 표현할 때 사용됩니다.
  • 구조는 상속

    을 지원하지 않지만 모든 구조는 System.ValueType에서 상속되며 System.Object에서 상속됩니다.
  • 구조를 사용하여 필드가 메모리에 배치되는 방식을 지정할 수 있습니다.

  • 구조체의 경우 컴파일러는 항상 대체가 허용되지 않는 인수 없는 기본 생성자를 제공하며 필드에 초기값을 제공할 수 없습니다. 구조에서 생성자에 제공되어야 합니다.

  • 구조체의 공개 필드는 허용되는 프로그래밍 방법입니다.

  •   在定义结构时使用new关键字只不过是用于调用其构造函数,变量的声明实际上才是为结构分配空间,所以以下代码不被报错。

1 MyStruct myStruct /*= new MyStruct()*/;
2 myStruct.Name = "Earl Jones";
3 myStruct.Age = 17;
로그인 후 복사

  覆盖结构默认的构造函数会报错

    

3.6 弱引用

  在代码中实例化一个类或结构时,只要有代码引用它,就会形成强引用。

  强引用和弱引用的区别是,强引用只要有引用就不会被GC回收,而弱引用随时都可能被GC回收,所以使用它的时候必须确定其是否存活。如:

<span style="font-family: &#39;Microsoft YaHei&#39;;"><span style="color: #008080;">1</span> <span style="color: #000000;">    MyClass myClass;<br/></span><span style="color: #008080;">2</span>     WeakReference weakMyClass = <span style="color: #0000ff;">new</span> WeakReference(<span style="color: #0000ff;">new</span><span style="color: #000000;"> MyClass());<br/></span><span style="color: #008080;">3</span>     <span style="color: #0000ff;"><a href="http://www.php.cn/wiki/109.html" target="_blank">if</a></span><span style="color: #000000;"> (weakMyClass.IsAlive)<br/></span><span style="color: #008080;">4</span> <span style="color: #000000;">     {<br/></span><span style="color: #008080;">5</span>          myClass = weakMyClass.Target <span style="color: #0000ff;">as</span><span style="color: #000000;"> MyClass;<br/></span><span style="color: #008080;">6</span> <span style="color: #000000;">         Console.WriteLine(myClass.value); <br/></span><span style="color: #008080;">7</span> <span style="color: #000000;">      } </span></span>
로그인 후 복사

3.7 部分类

  Partial关键字可以允许把类、结构、方法或结构放在多个文件中。

  如果声明类似使用了下面的关键字,这些关键字就必须应用于同一个类的所有部分:

  •   访问修饰符

  •   abstract

  •   sealed

  •   new

  •   一般约束

3.9 Object类

  所有类都继承自System.Object类。

  方法:

  • ToString();

  • GetHashCode();

  • Equals();这里有三个比较三个用于比较对象相等性的方法。

  • Finalize();

  • GetType();

  • GMemberwiseClone();

3.10 扩展方法

  扩展方法用于在某些不能直接修改源代码中的类中添加方法。


 1         using System; 
 2          
 3         namespace 扩展方法 
 4         { 
 5             class Program 
 6             { 
 7                 static void Main(string[] args) 
 8                 { 
 9                     MyClass myClass1 = new MyClass();
 10                     myClass1.SayHiToSomeone();
 11                     myClass1.SayHi();
 12                     Console.ReadKey();
 13                 }
 14             }
 15         
 16             class MyClass
 17             {
 18                  public void SayHi()
 19                 { 
20             Console.WriteLine("我是最原始的方法"); 
21             }
22             }
23         
24             static class AddMyClass
25             {
26                 static public void SayHiToSomeone(this MyClass myClass)27                 { 
28             Console.WriteLine("我是一个扩展方法"); 
29             }
30         
31                 static public void SayHi(this MyClass myClass)
32                 {
33              Console.WriteLine("我是扩展方法SayHi");
34              }
35             }
36         }
로그인 후 복사

  输出的结果:

  

  由上得出:

  •     扩展方法必须定义在一个静态类中。

  •     扩展方法的第一个参数为放在 this 后的类,这个方法就是这个类的一部分。

  •     即是扩展方法是一个静态方法,也要使用调用实例方法的语法经行调用。

  •     如果扩展方法与类中某个方法同名,就从来不会调用扩展方法。

 

위 내용은 C# 고급 프로그래밍(3) - 개체 및 유형에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!