มีบางครั้งที่ฉันจะต้องแก้ไขค่าที่ส่งผ่านไปยังเมธอดจากภายในเมธอดเอง ตัวอย่างจะทำให้บริสุทธิ์สตริงเช่นวิธีนี้ที่นี่:
void SanitizeName(string Name)
{
Name = Name.ToUpper();
//now do something here with name
}
สิ่งนี้ไม่เป็นอันตรายอย่างName
แท้จริงเนื่องจากอาร์กิวเมนต์ไม่ได้ถูกส่งผ่านโดยการอ้างอิง อย่างไรก็ตามถ้าด้วยเหตุผลบางอย่างผู้พัฒนาในอนาคตตัดสินใจที่จะให้ค่าทั้งหมดผ่านโดยอ้างอิงการฆ่าล้างของสตริงจะส่งผลกระทบต่อค่านอกวิธีการที่อาจมีผลเป็นอันตราย
ดังนั้นแทนที่จะกำหนดใหม่ให้กับข้อโต้แย้งตัวเองฉันมักจะสร้างสำเนาท้องถิ่นเช่น:
void SanitizeName(string Name)
{
var SanitizedName = Name.ToUpper();
//now do something here with name
}
สิ่งนี้ทำให้มั่นใจได้ว่าการเปลี่ยนแปลงค่าที่ส่งผ่านจะไม่ส่งผลกระทบต่อการดำเนินการด้านนอกวิธีการ แต่ฉันสงสัยว่าฉันกำลังหวาดระแวงเกี่ยวกับเรื่องนี้มากเกินไป
if (param == NULL) param = default_value;
อะไร
by ref
ที่ไม่ผ่านที่ ทางก่อนและดังนั้นการแปลงการเข้าถึงในท้องถิ่นเพื่อการเข้าถึงที่ไม่ใช่ท้องถิ่นด้วยเหตุผลบางอย่างเขามักจะตรวจสอบผลที่ตามมาอย่างรอบคอบ
Name = Name.ToUpper();
ทำให้โค้ดยากต่อการติดตามในหัวของคุณเป็นค่าของName
การเปลี่ยนแปลง ตัวอย่างที่สองของคุณไม่เพียงพิสูจน์ได้ในอนาคตเท่านั้น แต่ยังง่ายกว่าที่จะให้เหตุผลว่าทำอะไรอยู่