อะไรคือสิ่งที่เทียบเท่าของ Java final
ใน C #?
อะไรคือสิ่งที่เทียบเท่าของ Java final
ใน C #?
คำตอบ:
final
คำหลักที่มีประเพณีหลายอย่างใน Java มันสอดคล้องกับทั้งsealed
และreadonly
คำหลักใน C # ขึ้นอยู่กับบริบทที่มีการใช้
เพื่อป้องกันไม่ให้คลาสย่อย (การสืบทอดจากคลาสที่กำหนด):
ชวา
public final class MyFinalClass {...}
ค#
public sealed class MyFinalClass {...}
ป้องกันการแทนที่virtual
วิธีการ
ชวา
public class MyClass
{
public final void myFinalMethod() {...}
}
ค#
public class MyClass : MyBaseClass
{
public sealed override void MyFinalMethod() {...}
}
เป็นจุดโจอาคิมซาวเออร์ออกความแตกต่างที่โดดเด่นระหว่างสองภาษาที่นี่เป็นที่ Java ด้วยเครื่องหมายเริ่มต้นทุกวิธีไม่คงที่เป็นvirtual
ในขณะที่ C เครื่องหมาย # sealed
พวกเขาเป็น ดังนั้นคุณจะต้องใช้sealed
คำหลักใน C # ถ้าคุณต้องการที่จะหยุดการเอาชนะเพิ่มเติมของวิธีการที่ได้รับการทำเครื่องหมายอย่างชัดเจนvirtual
ในชั้นฐาน
หากต้องการอนุญาตให้กำหนดตัวแปรเพียงครั้งเดียว:
ชวา
public final double pi = 3.14; // essentially a constant
ค#
public readonly double pi = 3.14; // essentially a constant
ในฐานะที่เป็นหมายเหตุด้านผลกระทบของreadonly
คำหลักที่แตกต่างจากconst
คำหลักในการreadonly
แสดงออกที่มีการประเมินที่รันไทม์มากกว่ารวบรวมเวลาดังนั้นการอนุญาตให้แสดงออกโดยพลการ
readonly
ตัวแปรสมาชิกสามารถแก้ไขได้ในตัวสร้าง: pastebin.com/AzqzYGiA
มันขึ้นอยู่กับบริบท
final
ชั้นเรียนหรือ method, C # sealed
เทียบเท่าfinal
ข้อมูลที่C # readonly
เทียบเท่าfinal
ตัวแปรโลคัลหรือพารามิเตอร์เมธอดไม่มีการเทียบเท่า C # โดยตรงFor a final local variable or method parameter, there's no direct C# equivalent
ความแตกต่างที่ยิ่งใหญ่
const
สามารถใช้ได้กับประเภทค่าเท่านั้น เท่าที่ฉันรู้ไม่มีวิธีที่จะทำให้ค่าคงที่มีประสิทธิภาพสำหรับประเภทการอ้างอิงในท้องถิ่น
สิ่งที่ทุกคนที่นี่หายไปคือการรับประกันของ Java ของการกำหนดที่แน่นอนสำหรับตัวแปรสมาชิกสุดท้าย
สำหรับคลาส C ที่มีตัวแปรสมาชิกขั้นสุดท้าย V ทุกเส้นทางการดำเนินการที่เป็นไปได้ผ่านตัวสร้าง C ทุกตัวจะต้องกำหนด V อย่างแน่นอนหนึ่งครั้ง - การไม่กำหนด V หรือการมอบหมาย V สองครั้งขึ้นไปจะส่งผลให้เกิดข้อผิดพลาด
คำหลักแบบอ่านอย่างเดียวของ C # ไม่มีการรับประกันดังกล่าว - คอมไพเลอร์ยินดีที่จะออกจากสมาชิกแบบอ่านอย่างเดียวที่ไม่ได้กำหนดหรืออนุญาตให้คุณกำหนดหลาย ๆ ครั้งภายในคอนสตรัคเตอร์
ดังนั้นสุดท้ายและอ่านได้อย่างเดียว (อย่างน้อยเกี่ยวกับตัวแปรของสมาชิก) ไม่แน่นอนเทียบเท่า - สุดท้ายนั้นเข้มงวดมากขึ้น
ดังกล่าวsealed
เป็นวิธีการเทียบเท่าfinal
และชั้นเรียน
ส่วนที่เหลือมันซับซ้อน
สำหรับstatic final
เขตข้อมูลstatic readonly
เป็นสิ่งที่ใกล้เคียงที่สุดที่เป็นไปได้ จะช่วยให้คุณสามารถเริ่มต้นสนามคงที่ในการสร้างคงที่ซึ่งค่อนข้างคล้ายกับเริ่มต้นคงที่ใน Java สิ่งนี้ใช้กับค่าคงที่ (วัตถุพื้นฐานและวัตถุที่ไม่เปลี่ยนรูป) และการอ้างอิงค่าคงที่ไปยังวัตถุที่ไม่แน่นอน
const
ปรับปรุงค่อนข้างคล้ายกันสำหรับค่าคงที่ แต่คุณไม่สามารถตั้งไว้ในตัวสร้างแบบคงที่
readonly
สามารถใช้งานได้ มันไม่เท่ากัน - final
ต้องมีหนึ่งการกำหนดแม้ใน constructor หรือ initializerไม่มีค่าเทียบเท่า C # สำหรับfinal
ตัวแปรโลคอลที่ฉันรู้จัก หากคุณสงสัยว่าทำไมใครถึงต้องการ: คุณสามารถประกาศตัวแปรก่อน if-else, switch-caseหรือดังนั้น เมื่อประกาศให้เป็นที่สุดคุณจะต้องบังคับใช้ว่าได้รับการมอบหมายให้มากที่สุดครั้งเดียว
ตัวแปรโลคัล Java โดยทั่วไปจำเป็นต้องกำหนดอย่างน้อยหนึ่งครั้งก่อนที่จะอ่าน ยกเว้นว่าสาขากระโดดก่อนที่จะอ่านค่าตัวแปรสุดท้ายจะถูกกำหนดอย่างแน่นอนหนึ่งครั้ง ทั้งหมดนี้ถูกตรวจสอบเวลาคอมไพล์ ต้องใช้รหัสที่ทำงานได้ดีโดยมีระยะห่างน้อยกว่าสำหรับข้อผิดพลาด
สรุป up, C # final
ไม่มีเทียบเท่าโดยตรงของ ในขณะที่ Java ไม่มีคุณสมบัติที่ดีบางอย่างของ C # มันเป็นความสดชื่นสำหรับฉันเป็นส่วนใหญ่โปรแกรมเมอร์ Java เพื่อดูว่า C # ล้มเหลวในการส่งมอบเทียบเท่า
Java class final และ method final -> Sealing ตัวแปรสมาชิก Java สุดท้าย -> อ่านได้อย่างเดียวสำหรับค่าคงที่รันไทม์, const สำหรับค่าคงที่เวลารวบรวม
ไม่เทียบเท่าสำหรับ Local Variable final และอาร์กิวเมนต์ method เป็นครั้งสุดท้าย
ค่าคงที่ C # ถูกประกาศโดยใช้คีย์เวิร์ด const สำหรับค่าคงที่เวลาคอมไพล์หรือคีย์เวิร์ดแบบอ่านอย่างเดียวสำหรับค่าคงที่รันไทม์ ความหมายของค่าคงที่จะเหมือนกันทั้งในภาษา C # และ Java
ที่ปิดผนึก