C#.net에서 제공하는 in, out, ref, paras 4가지 키워드는 개발 시 자주 사용되는데 어떻게 사용하는 걸까요?
in은 대리자 및 인터페이스에서만 사용됩니다.
예:
//测试模型 class Model { public int a { get; set; } public Model(int a) { this.a = a; } }//创建3个实例List<Model> modelList= new List<Model>() { new Model(1), new Model(4), new Model(6) };//调用foreach接口,试着操作3个实例,赋值为nullmodelList.ForEach(e=>e=null); //查看结果://modelList的取值不变。
이유를 분석하면 ForEach의 매개 변수는 대리자 함수입니다.
//ForEach方法:public void ForEach(Action<T> action);//委托声明:public delegate void Action<in T>(T obj);
대리자 일반적이며 T 유형 앞에 키워드 in이 추가됩니다. 키워드 in 때문에 T obj를 수정할 수 없습니다.
테스트해 보세요:
//修改元素e的属性amodelList.ForEach(e=>{e.a*=2;});
결과적으로 각 요소는 2를 곱하여 2,8,12가 됩니다. 객체의 속성이 수정될 수 있음을 알 수 있습니다.
out 키워드 사용법 참고:
1) out이 없는 형식 매개변수의 경우 함수 정의 시 반환 전에 해당 함수에 하나를 할당해야 합니다. 값.
2) 함수를 호출할 때, 없는 매개변수에는 초기값을 할당할 필요가 없습니다.
3) out 형식 매개변수의 값은 참조로 전달됩니다(by reference)
out 사용 시나리오:
함수가 여러 값을 반환할 때 일반적으로 out은 그 중 하나를 반환하는 데 사용됩니다. 🎜>
public bool Operation(out Model updateMod) { updateMode = new Model(5); try{ // my operation ... // return true; } catch{ //写入日志 return false; } }//使用Model um; //未初始化bool rtnMsg = Operation(out um); //如果初始化,传值通过reference//分析://返回um,如果rntMsg为ture,则um按照预想逻辑被赋值, //如果rntMsg为false 则um未按照预想逻辑被赋值。
public void reviseModel(int a) { a = 12; } Model model = new Model(10); //调用reviseModelreviseModel(model.a); //model.a仍然=10;by-valuereviseMode(ref model.a); //编译不过,提示ref后的参数不归类与变量int a; reviseMode(ref a); //如果不给变量a赋一个初始值, //编译器也是提示:调用前未被赋值的错误 //因此赋值int a= model.a; //变量a初始值为10;reviseMode(ref a); //修改变量a=12;但是model.a的值仍然为10
//直接将参数设为Model对象,则函数调用时,传值通过by referencepublic void reviseModel(Model md) { md.a = 12; } reviseModel(model );//传值通过by reference
ref는 기본 유형, 구조 등과 같은 값 변수를 처리하는 데 사용됩니다. 새 것일 필요는 없으며 값은 전송은 가치 복사를 기반으로 합니다.
4 out ref에 대한 심층 논의
out ref의 사용과 이를 사용하지 않을 경우 어떤 영향을 미칠지 주로 분석합니다. 1) C#에는 Int.TryParse와 같은 Try...라는 메서드 클래스가 있습니다. 이는 부울 값을 반환하고 문자열을 정수로 구문 분석하려고 시도합니다. true를 반환하고 결과 정수는 다음과 같습니다. int가 두 번째 출력으로 전달됩니다.분석 기사 보기
예외 설계 지침
Parse 및 TryParse를 통한: Try-Parse 및 Tester-Doer 모드
기사에서 볼 수 있듯이 매개변수가 없는 하위 메서드 Parse와 비교 , 구문 분석된 경우 문자열이 실패하면 매개변수 오류 예외가 발생합니다.
더 간결하므로 이는 out 매개 변수를 사용하는 일반적인 시나리오가 되었습니다.
2) Java와 C# 비교Java에서는 HashMap// HashMap<K, V> map; // K key; V val = map.get(key);if (val != null) { // ...}
이 둘을 구별하기 위해 HashMap은 containKey() 메서드를 제공합니다. 따라서 이를 작성하는 올바른 방법은 다음과 같습니다.
// HashMap<K, V> map; // K key;if (map.containsKey(key)) { V val = map.get(key); // ...}
TryGetValue: Dictionary(TKey, TValue).TryGetValue Method (TKey, TValue) (System.Collections.Generic)public bool TryGetValue( TKey key, out TValue value )ParameterskeyType: TKey The key of the value to get. valueType: TValue
// Dictionary<TKey, TValue> dict; // TKey key; TValue val;if (dict.TryGetValue(key, out val)) { // ...}
public void GetPlansByInputControl(string planState, string contactno,DatePair dp) { string planStat = ""; switch (planState) { case "...": planStat = "..."; break; case "...": planStat = "..."; break; } plans = getPlansWithCondition(Convert.ToDateTime(dp.startValue), Convert.ToDateTime(dp.endValue), planStat, contactno); }
private List<MPartPlan> getMPartPlansWithCondition(DateTime dateTime, DateTime dateEndTime, string planStat, string contactNo) { var conditions = new CslSqlBaseSingleTable(); conditions.AddCondition("RequireStartDate", dateTime, DataCompareType.GreaterOrEqual); conditions.AddCondition("RequireStartDate", dateEndTime, DataCompareType.LessOrEqual); conditions.AddCondition("OrderCode", contactNo, DataCompareType.Equal); if (!string.IsNullOrEmpty(planStat)) { conditions.AddCondition("PlanState", planStat, DataCompareType.Equal); } return _cslMPartPlan.QueryListInSingleTable(typeof(MPartPlan), conditions); } }
입니다. 문제는 쿼리가 다른 필드를 추가할 때 다른 버전을 다시 로드하시겠습니까?
5.2 매개변수 적용
private List<MPartPlan> getMPartPlansWithCondition(DateTime dateTime, DateTime dateEndTime, string planStat, string contactNo,string newField);
C#에서 매개변수를 제공하는 경우 물론 다음과 같이 getMPartPlansWithCondition을 직접 다시 작성할 필요는 없습니다
private List<MPartPlan> getMPartPlansWithCondition(params object[] queryConditions); { queryConditions[0] queryConditions[1] queryConditions[2] queryConditions[3] queryConditions[4] //放到字典中dict sqlQuery(dict); }
향후에는 다음에서 쿼리 필드를 추가할 수 있습니다. 이 기능만 수정하면 됩니다. 오버로드된 버전을 추가하거나 삭제할 필요가 없습니다! ! !
고객 호출, 필드를 직접 추가하세요
_bsl.GetPlansByInputControl(field1, field2,field3,field4,field5);
5.3 요약
queryFun(params object[] objs), 이 매개변수가 있는 함수에는 하나의 버전만 필요하므로 숫자 불일치로 인해 여러 버전이 오버로드되는 문제를 해결합니다.
클라이언트에서 호출하면 속성 매개변수가 나열될 수 있습니다. 하나씩.
C#.net에서 제공하는 in, out, ref, paras 4가지 키워드는 개발 시 자주 사용되는데 어떻게 사용하나요?
위는 C#입니다. in, out, ref, paras 사용법에 대한 자세한 소개는 PHP 중국어 홈페이지(www.php.cn)를 참고해주세요!