>  기사  >  백엔드 개발  >  C# 배열을 매개변수로 전달하는 문제 해결

C# 배열을 매개변수로 전달하는 문제 해결

黄舟
黄舟원래의
2017-09-19 11:28:212245검색

원칙: 데이터 수정을 최대한 제어하세요. 특정 데이터가 변경되지 않거나 변경되지 않아야 한다고 예측할 수 있는 경우 이 데이터를 사용하는 호출자가 해당 값을 변경하지 않을 것이라고 기대하지 마세요.

사용 중에 매개변수가 실수로 수정되면 예측할 수 없는 결과가 발생하며 이 오류를 감지하기 어렵습니다. 따라서 메소드 매개변수를 설계할 때 참조 유형 매개변수 또는 참조 전달로 인해 발생할 수 있는 결과를 충분히 고려해야 합니다. 이런 식으로.

전송 프로세스 중에 데이터 조각을 변경할 수 없는 경우 개체를 생성할 때 값(필드 또는 속성)을 변경하면 안 됩니다.

1. 단순 매개변수 제어

1. 값형 매개변수 전달

이 경우 매개변수의 복사본이 전달되기 때문에 원래 값에 영향을 미치지 않으며 제어가 필요하지 않습니다.

2. 참조 유형 매개변수 전달

a. 값 유형으로 구성된 데이터 구조

는 필드를 읽기 전용으로 설정하고 속성만 가져옵니다. 할당은 생성자를 통해서만 수행할 수 있습니다.

b. 참조 유형 필드를 포함하는 데이터 구조

이 상황은 필드가 읽기 전용이고 동시에 참조 유형 필드에서 사용되는 유형도 충족하는지 확인해야 합니다. 이 요구 사항.


public class SuperClass
{    private readonly int  _no;    private readonly SubClass _tag; 
    public int NO
   {         get{ return _no;}
   }    
    public SubClass Tag
    {         get{ retirn _tag;}
     }      
      public SuperClass(int no,SubClass tag)
      {
            _no=no;
            _tag=tag;   
       }
} 
 
public class SubClass
{     private readonly int _field;     
     public int Field
     {          get{ return _field;}
     } 
     public SubClass(int field)
    {
          _field=field;
     }
}

2. 복잡한 참조 유형 매개변수 전달 제어

소위 복잡성이란 매개변수가 배열 또는 컬렉션 유형이거나 매개변수에 이러한 유형의 데이터가 포함되어 있음을 의미합니다. 메소드는 매개변수 데이터가 수정되지 않는다고 보장할 수 없습니다. 왜냐하면 객체가 읽기 전용이더라도 객체의 배열 또는 컬렉션 필드(속성)는 여전히 수정될 수 있기 때문입니다.

1. 컬렉션 매개변수(컬렉션 필드가 포함된 참조 매개변수에도 동일하게 적용됨)

.net 4.5 이전 버전에서는 특정 컬렉션 유형 대신 컬렉션 요소를 수정하는 메서드가 포함되지 않은 인터페이스를 사용할 수 있습니다. 예를 들어 List 대신 IEnumerable 인터페이스를 사용하세요. 버전 4.5에서는 IReadOnlyCollection 인터페이스 또는 이 인터페이스를 구현하는 컬렉션 유형을 직접 사용할 수 있습니다.

2. 배열 매개변수

배열 유형 매개변수가 수정되는 것을 방지할 수 있는 좋은 방법은 없으므로 선택적 매개변수를 사용하지 않는 한 배열 유형을 메소드 매개변수로 사용하지 마십시오.

3. 위 내용을 이해하려면 개념의 차이를 구분해야 합니다.

1. 값 전송과 참조 전송의 차이점

2. )

3. 참조 유형 매개변수 전달과 참조(ref 및 out) 참조 유형 매개변수 전달의 차이점 [이것이 가장 혼란스럽습니다.]

차이점은 사용 중에 참조를 위해 새 객체가 생성될 때입니다. 이 매개변수에서 전자는 원래 값에 영향을 주지 않으며 후자는 원래 값에 영향을 미칩니다. 예:


void FunA(MyClass a)

{

     a=new MyClass("A");

} 

void FunB(ref MyClass a)

{

     a=new MyClass("B");

} 

void Test()

{

  MyClass a=new MyClass("A");   

      FunA(a);                

      Print(a);              //a还是原始的对象 TEST
 

      FunB(ref a);

       Print(a);               //a变为新对象   B}

원칙 기억하기:

값 유형은 값의 복사본을 전송하고 참조는 유형은 객체 참조를 전송하므로 값 매개변수의 수정은 원래 값에 영향을 주지 않으며 참조 유형의 수정은 원래 값에 영향을 미칩니다. 값으로 전달된 매개변수 구성은 원래 값에 영향을 주지 않으며 참조 전달(ref 및 out) 원래 값에 영향을 미칩니다.

위 내용은 C# 배열을 매개변수로 전달하는 문제 해결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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