원칙: 데이터 수정을 최대한 제어하세요. 특정 데이터가 변경되지 않거나 변경되지 않아야 한다고 예측할 수 있는 경우 이 데이터를 사용하는 호출자가 해당 값을 변경하지 않을 것이라고 기대하지 마세요.
사용 중에 매개변수가 실수로 수정되면 예측할 수 없는 결과가 발생하며 이 오류를 감지하기 어렵습니다. 따라서 메소드 매개변수를 설계할 때 참조 유형 매개변수 또는 참조 전달로 인해 발생할 수 있는 결과를 충분히 고려해야 합니다. 이런 식으로.
전송 프로세스 중에 데이터 조각을 변경할 수 없는 경우 개체를 생성할 때 값(필드 또는 속성)을 변경하면 안 됩니다.
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
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!