VB ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่จริงหรือ?


122

ฉันไม่ได้พยายามเริ่มต้นอาร์กิวเมนต์ที่นี่ แต่ไม่ว่าด้วยเหตุผลใดก็ตามโดยทั่วไปแล้วจะมีการระบุว่า Visual Basic ไม่คำนึงถึงตัวพิมพ์เล็กและภาษา C (และนั่นก็เป็นสิ่งที่ดี)

แต่นี่คือคำถามของฉัน: กรณี Visual Basic ไม่สำคัญตรงไหน? เมื่อฉันพิมพ์ ...

Dim ss As String
Dim SS As String

... ในVisual Studio 2008หรือVisual Studio 2010 IDE อันที่สองมีคำเตือน " Local variable SSถูกประกาศแล้วในบล็อกปัจจุบัน " ใน VBA VBE จะไม่เตะข้อผิดพลาดในทันที แต่เป็นการแก้ไขกรณีโดยอัตโนมัติ

ฉันพลาดอะไรบางอย่างที่นี่กับอาร์กิวเมนต์ที่ Visual Basic ไม่คำนึงถึงขนาดตัวพิมพ์หรือไม่ (นอกจากนี้ถ้าคุณรู้หรือสนใจที่จะตอบทำไมมันถึงเป็นเรื่องไม่ดี?)

ทำไมฉันถึงถามคำถามนี้

ฉันใช้ Visual Basic ในหลาย ๆ ภาษามาหลายปีแล้วบางครั้งก็เป็นงานอดิเรกบางครั้งก็ใช้โปรแกรมที่เกี่ยวข้องกับธุรกิจขนาดเล็กในเวิร์กกรุ๊ป ในช่วงหกเดือนที่ผ่านมาฉันทำงานในโครงการใหญ่ซึ่งใหญ่กว่าที่ฉันคาดไว้มาก ซอร์สโค้ดตัวอย่างส่วนใหญ่มีอยู่ใน C # ฉันไม่มีความปรารถนาอย่างแรงกล้าที่จะเรียนรู้ C # แต่ถ้ามีบางสิ่งที่ฉันพลาดในข้อเสนอ C # นั้นที่ Visual Basic ไม่มี (ตรงกันข้ามคือ VB.NET เสนอXML Literals ) ฉันก็ต้องการ เพื่อทราบข้อมูลเพิ่มเติมเกี่ยวกับคุณลักษณะนั้น ดังนั้นในกรณีนี้มักเป็นที่ถกเถียงกันอยู่ว่าภาษา C มีความละเอียดอ่อนและเป็นสิ่งที่ดีและ Visual Basic ไม่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ซึ่งไม่ดี ฉันอยากรู้ว่า ...

  1. Visual Basic case ไม่ไวต่อความรู้สึกเพียงใดเนื่องจากทุกตัวอย่างในตัวแก้ไขโค้ดกลายเป็นกรณีที่สำคัญ (หมายถึงกรณีได้รับการแก้ไข) ไม่ว่าฉันต้องการหรือไม่ก็ตาม
  2. สิ่งนี้น่าสนใจเพียงพอสำหรับฉันที่จะพิจารณาย้ายไปที่ C # หรือไม่หากกรณี VB.NET จำกัด สิ่งที่ฉันสามารถทำได้กับโค้ด

5
+1 ฉันเคยสงสัยเกี่ยวกับสิ่งเดียวกันนี้มาก่อน
NakedBrunch

7
อืมมม ... ไม่แน่ใจว่าคุณเข้าใจสิ่ง CASE- ในวิธีที่มีความละเอียดอ่อน เนื่องจาก VB ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ SS และ ss จึงเป็นชื่อเดียวกันในขณะที่ใน C จะไม่เป็น
Ed S.

1
@ed: ฉันไม่สามารถใช้ทั้งสองอย่างSSและssใน VB ได้สิ่งที่ฉันใช้ก่อนคืออันที่ตัวแก้ไขใช้
Todd Main

1
โอตาคุฉันขอแนะนำให้ใช้คำถามนี้โดยมุ่งเน้นไปที่ความหมายที่ชัดเจนว่า VB ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่และวิธีการใช้งาน คำถามที่ว่าจะดีกว่าหรือไม่ที่ภาษาจะไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่อาจเริ่มสงครามเปลวไฟได้ หากคุณสงสัยจริงๆให้ถามในคำถามอื่น (ฉันไม่แนะนำให้คุณทำ แต่ถ้าคุณต้องแท็กเป็นอัตนัยและทำให้เป็นวิกิชุมชน)
MarkJ

16
คุณ (หรือเคย) คิดเรื่องนี้กลับหัว เป็นเพราะคอมไพเลอร์ไม่คำนึงถึงขนาดตัวพิมพ์ที่ข้อผิดพลาดอ่าน 'ตัวแปร SS ที่ประกาศไว้แล้ว' หากเป็นกรณีที่คำนึงถึงตัวพิมพ์เล็กและตัวพิมพ์ใหญ่คุณจะได้รับ 'ตัวแปร ss ไม่ได้ใช้' หรือไม่มีข้อผิดพลาดเลยและจะเกิดข้อผิดพลาดหากคุณใช้หรืออีกตัวเลือกหนึ่ง
Adriano Varoli Piazza

คำตอบ:


108

ความแตกต่างระหว่าง VBA และVB.NETเป็นเพียงเพราะ VB.NET รวบรวมอย่างต่อเนื่องในพื้นหลัง คุณจะได้รับข้อผิดพลาดเมื่อคุณรวบรวม VBA

เช่นเดียวกับที่โจนาธานพูดเมื่อเขียนโปรแกรมคุณสามารถนึกถึง VB.NET ว่าไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่นอกเหนือจากการเปรียบเทียบสตริง XML และสถานการณ์อื่น ๆ

ฉันคิดว่าคุณสนใจสิ่งที่อยู่ภายใต้ประทุน NET Common Language Runtime นั้นคำนึงถึงตัวพิมพ์เล็กและใหญ่และรหัส VB.NET อาศัยรันไทม์ดังนั้นคุณจะเห็นว่าต้องคำนึงถึงขนาดตัวพิมพ์ที่รันไทม์เช่นเมื่อค้นหาตัวแปรและวิธีการ

คอมไพลเลอร์และตัวแก้ไข VB.NET ช่วยให้คุณเพิกเฉยต่อสิ่งนั้น - เพราะมันแก้ไขกรณีในโค้ดของคุณ

หากคุณเล่นกับคุณลักษณะแบบไดนามิกหรือการเชื่อมต่อล่าช้า (Option Strict Off) คุณสามารถพิสูจน์ได้ว่ารันไทม์พื้นฐานนั้นคำนึงถึงขนาดตัวพิมพ์ อีกวิธีหนึ่งในการดูนั่นคือการตระหนักว่าภาษาที่คำนึงถึงตัวพิมพ์เล็กและใหญ่เช่น C # ใช้รันไทม์เดียวกันดังนั้นรันไทม์จึงรองรับการพิจารณาตัวพิมพ์เล็กและใหญ่อย่างชัดเจน

แก้ไขหากคุณต้องการนำ IDE ออกจากสมการคุณสามารถคอมไพล์จากบรรทัดคำสั่งได้ตลอดเวลา แก้ไขรหัสของคุณในNotepadจึงมีssและSSและดูสิ่งที่คอมไพเลอร์ไม่

แก้ไขข้อความอ้างอิงจากJeffrey Richterใน. NET Framework Design Guidelinesหน้า 45

เพื่อความชัดเจน CLR นั้นคำนึงถึงขนาดตัวพิมพ์ ภาษาโปรแกรมบางภาษาเช่น Visual Basic ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ เมื่อคอมไพเลอร์ Visual Basic พยายามแก้ไขการเรียกเมธอดไปยังชนิดที่กำหนดในภาษาที่คำนึงถึงตัวพิมพ์เล็กและใหญ่เช่น C # คอมไพลเลอร์ (ไม่ใช่ CLR) จะระบุกรณีจริงของชื่อเมธอดและฝังไว้ในเมทาดาทา CLR ไม่รู้อะไรเกี่ยวกับเรื่องนี้ ตอนนี้หากคุณใช้การสะท้อนเพื่อเชื่อมโยงกับวิธีการหนึ่ง API การสะท้อนจะเสนอความสามารถในการค้นหาแบบไม่คำนึงถึงขนาดตัวพิมพ์ นี่คือขอบเขตที่ CLR นำเสนอแบบไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่


คำตอบที่ดีที่สุดที่ฉันเคยได้ยินมา มีบางทางที่จะพิสูจน์จุดนี้ว่าคอมไพเลอร์และตัวแก้ไข VB.Net ปล่อยให้คุณเพิกเฉยหรือไม่? มีวิธีปิดการแก้ไขอัตโนมัติอย่างไรบ้าง? หรือมีวิธีรวบรวม sln ที่ไม่ได้เขียน VS IDE ใน MSBuild ที่ใช้ทั้งสองอย่างssและSSจะคอมไพล์และทำงานตามที่คาดไว้หรือไม่?
Todd Main

5
คุณสามารถปิดการแก้ไขอัตโนมัติโดยการโกง คลิกขวาที่ไฟล์ vb แล้วเลือก "Open With" จากนั้นเลือก "XML (Text) Editor" คุณจะสูญเสียฟังก์ชันการทำงานเฉพาะ VB ทั้งหมดเช่นแก้ไขอัตโนมัติ
Jonathan Allen

+1 คำตอบที่ดีและคำถามที่ดีเช่นกันโอตาคุ (ฉันคิดว่าคุณรู้แล้ว แต่ต้องการให้คำจำกัดความที่ดีเฮ้?)
Anonymous Type

คอมไพเลอร์ VB.NET / IDE ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ 100% ตัวอย่างเช่นDim pdfWriter As PDFWriterใช้ได้อย่างสมบูรณ์ VB.NET ช่วยให้คุณสามารถแยกความแตกต่างระหว่างชื่อคลาสและชื่อตัวแปรซึ่งถือเป็นเรื่องที่ดีเนื่องจากเป็นเรื่องปกติในภาษาที่คำนึงถึงตัวพิมพ์เล็กและใหญ่
ส่วนผสม

วิธี VB เหมาะสำหรับการทำงานร่วมกัน ตัวอย่าง: สร้าง DLL ใน C # ด้วยอีเมลเป็น String และ Email () เป็นคุณสมบัติที่มีเหตุการณ์ inotifypropertychanged อยู่ในนั้น C # จะคอมไพล์ได้ดีและ DLL จะถูกสร้างขึ้น พยายามอ้างอิง DLL นี้ใน VB หรือภาษาที่คล้ายกัน มันจะบอกว่ามีข้อขัดแย้งในอีเมลตัวแปร / อีเมลในไลบรารี เครื่องมือวิเคราะห์โค้ดชี้ว่านี่เป็นปัญหาในคอมไพเลอร์ C # ที่ไม่อยู่ในคอมไพเลอร์ VB
Venkat

22

ปัญหาส่วนหนึ่งคือคุณต้องแบ่งภาษาจากประสบการณ์ IDE

ในฐานะที่เป็นภาษาVB.NETนั้นไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่เมื่อเทียบกับตัวระบุ โทรDateTime.Parseและdatetime.parseจะผูกกับรหัสเดียวกันแน่นอน และแตกต่างจากภาษาเช่น C # คือไม่สามารถกำหนดวิธีการหรือประเภทที่แตกต่างกันไปตามกรณีเท่านั้น

ในฐานะ IDE VB.NET พยายามที่จะเก็บรักษากรณีของตัวระบุที่มีอยู่เมื่อมันแสดงรายการรหัสบล็อก รายการสวยจะเกิดขึ้นทุกครั้งที่คุณย้ายออกจากบรรทัดของรหัสตรรกะปัจจุบัน ในกรณีนี้คุณย้ายออกจากการประกาศครั้งที่สองของSSลิสเตอร์สวยจะสังเกตเห็นว่ามีตัวระบุที่มีอยู่พร้อมชื่อนั้นและแก้ไขให้มีตัวพิมพ์ที่ตรงกัน

แม้ว่าพฤติกรรมนี้จะทำเพื่อเพิ่มมูลค่าของผู้ใช้เท่านั้น ไม่ใช่ส่วนหนึ่งของภาษาหลัก


1
ขอบคุณ Jared น่าสนใจที่รู้ว่าเป็น IDE เท่านั้น ฉันยังไม่เข้าใจว่าเหตุใดจึงเป็นเรื่องดีที่จะมีชื่อมากกว่าหนึ่งชื่อแทนสิ่งที่แตกต่างกันโดยใช้ความแตกต่างของชื่อ แต่ฉันเดาว่าเป็นอีกวันหนึ่ง
Todd Main

1
ฉันไม่คิดว่า Jared หมายถึงมันเป็นเพียง IDE เท่านั้น ฉันคิดว่าเขาบอกว่าคอมไพเลอร์ไม่คำนึงถึงขนาดตัวพิมพ์ดังนั้นจึงคิดว่าssเหมือนกันSSแต่ยังช่วยในการอ่าน IDE ที่ถูกSSต้องssตามที่คุณพิมพ์ด้วย ดังนั้นแม้ว่า IDE จะไม่ได้แก้ไขกรณีนี้ แต่คอมไพเลอร์ก็ยังคงเห็นว่าตัวระบุทั้งสองเหมือนกัน
MarkJ

2
"ฉันยังไม่เข้าใจว่าทำไมจึงเป็นเรื่องดีที่จะมีชื่อมากกว่าหนึ่งชื่อแทนสิ่งที่แตกต่างกันโดยใช้ความแตกต่างของชื่อ" <- ฉันรู้สึกแบบเดียวกันก่อนที่จะเปลี่ยนจาก VBA / VB6 / VB.NET เป็น C # ฉันคิดว่าการมีชื่อแตกต่างกันไปในแต่ละกรณีดูเหมือนจะอันตรายโดยสิ้นเชิง อย่างไรก็ตามในทางปฏิบัติพิสูจน์แล้วว่ามีประโยชน์มากและน่าแปลกใจที่ไม่มีแนวโน้มที่จะเกิดข้อผิดพลาดเลย
Mike Rosenblum

2
@ ไมค์ฉันไม่เห็นด้วยกับประเด็นนั้นมาก ฉันไม่เคยเห็นชื่อซองแบบผสมที่ทำอะไรเลยนอกจากทำให้เกิดความสับสน
JaredPar

2
จริงๆ? ฉันหมายถึงบางอย่างเช่นโมฆะ SetColor (สีสี) {this.color = color}; ฉันตระหนักดีว่าสิ่งนี้อาจดูอันตราย แต่ทำงานได้อย่างราบรื่นคอมไพเลอร์จะไม่ปล่อยให้คุณทำผิดพลาดและ IntelliSense จะให้สมาชิกที่ถูกต้องหลังจาก "color" เทียบกับ "สี" สิ่งที่รบกวนใจฉันที่นี่ก็คือไม่จำเป็นต้องใช้ "this" - มันบังคับใช้โดย FxCop และ / หรือ StyleCop (ฉันลืมข้อไหน) แต่ฉันหวังว่าจะมีการตั้งค่าให้ IDE บังคับใช้สิ่งนี้เสมอเมื่อเข้าถึงคลาส สมาชิกแทนที่จะปล่อยให้ขอบเขตถูกเงาโดยไม่ได้ตั้งใจ
Mike Rosenblum

16

VB ส่วนใหญ่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ แต่มีข้อยกเว้น ตัวอย่างเช่นตัวอักษร XML และความเข้าใจจะพิจารณาตัวพิมพ์เล็กและใหญ่ การเปรียบเทียบสตริงมักจะพิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ซึ่งแตกต่างจากการพูด T-SQL แต่มีสวิตช์คอมไพเลอร์เพื่อให้การเปรียบเทียบสตริงไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ และแน่นอนว่ามีกรณีขอบเมื่อจัดการกับการสืบทอด COM และ Dynamic Language Runtime


3
จุดดีในกรณีที่มีความสำคัญเช่น XML Literals และการเปรียบเทียบสตริง แต่เมื่อเราพูดว่าส่วนใหญ่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่เรากำลังพูดถึงอะไรกันแน่? เมื่อย้ายไปที่ Outlook VBA เช่นเดียวกับตัวอย่างถ้าฉันพิมพ์Dim mi as mailitemและsubject = mi.subjectชื่อวัตถุจะได้รับการแก้ไขโดยอัตโนมัติMailItemและmi.Subject. คอมไพเลอร์ดูแลหรือไม่ (เพราะมันจะแก้ไขสิ่งนี้โดยอัตโนมัติอยู่เสมอ ) หรือรหัสนี้สวยหรือ ... ?
Todd Main

1
คอมไพเลอร์ไม่สนใจ คุณสามารถทดสอบได้โดยแก้ไขไฟล์ใน notepad และใช้คอมไพเลอร์บรรทัดคำสั่ง
Jonathan Allen

9

ใช่คอมไพเลอร์ VB.NET จะถือว่าตัวระบุในกรณีที่ไม่คำนึงถึงตัวพิมพ์ และใช่นั่นอาจทำให้เกิดปัญหาเมื่อใช้แอสเซมบลีที่เขียนในภาษาอื่นหรือใช้คอมโพเนนต์ COM อดีตกรณีได้รับการคุ้มครองโดยจำเพาะภาษาทั่วไป กฎที่เกี่ยวข้องคือ:

เพื่อให้ตัวระบุสองตัวถูกพิจารณาว่าแตกต่างกันต้องแตกต่างกันมากกว่าแค่กรณีของพวกเขา

เคส COM นั้นค่อนข้างได้รับการดูแลโดยผู้สร้างไลบรารีชนิดโดยบังคับให้ปลอกของตัวระบุที่มีชื่อเดียวกันต้องเหมือนกัน แม้ว่าตัวระบุเหล่านั้นจะมีบทบาทที่แตกต่างกันก็ตาม กล่าวอีกนัยหนึ่งพารามิเตอร์วิธีการที่มีชื่อ "ดัชนี" จะบังคับให้ชื่อเมธอด "ดัชนี" ถูกเรียกใหม่เป็น "ดัชนี" ที่ทำให้เกิดการเกาหัวค่อนข้างมากอย่างที่คุณคิด :)


6

VB เป็นกรณีการรักษา (ใน IDE) แต่กรณีตาย มันเหมือนกับระบบไฟล์ของ Windows ในทางหนึ่ง Hello.txt และ hello.txt ถือเป็นชื่อไฟล์เดียวกัน

IDE จะถือว่าการประกาศตัวแปรเป็นกรณีที่ "ถูกต้อง" สำหรับตัวแปรนั้นและปรับทุกอินสแตนซ์ของตัวแปรนั้นให้ตรงกับการประกาศ มันทำเพื่อความน่ารักและเหตุผลด้านความสม่ำเสมอ แต่ไม่ใช่เพื่อการใช้งาน

ฉันเคยเห็นหลายกรณีที่กรณีไม่ได้เปลี่ยนโดยอัตโนมัติเพื่อให้ตรงกับการประกาศและคำสั่งก็ใช้งานได้เหมือนกัน คุณยังสามารถใช้โปรแกรมแก้ไขข้อความใด ๆ เพื่อเขียนโค้ดที่จะรวบรวมได้ดีในกรณีต่างๆ

หมายเหตุด้านข้าง:

คนส่วนใหญ่คิดในลักษณะที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ เมื่อเราเห็นคำว่า "สุนัข" คำจะถูกแปลเป็นความหมายในใจของเรา ความหมายของคำนั้นไม่ได้ขึ้นอยู่กับกรณี (กล่าวคือไม่ว่าจะสะกดว่า "DOG", "DoG" หรือ "dOG" ก็ยังเห่าอยู่) คอมพิวเตอร์จะมองว่าคำนี้เป็นถุงที่ไม่ต่อเนื่องกัน ตัวพิมพ์ใหญ่และตัวพิมพ์เล็กเป็นรูปแบบบิตที่แตกต่างกันดังนั้นจึงแตกต่างกัน

เนื่องจากโปรแกรมเมอร์ส่วนใหญ่เป็นมนุษย์ความไม่ไวต่อตัวพิมพ์จึงดูเหมือนจะปรับให้เข้ากับวิธีคิดของผู้คนมากขึ้นและความอ่อนไหวของตัวพิมพ์ใหญ่ขึ้นเกี่ยวกับมนุษย์ที่ปรับวิธีคิดให้เข้ากับข้อ จำกัด ของเครื่องจักร


4
ยกเว้นว่าโปรแกรมเมอร์จำเป็นต้องแยกความแตกต่างระหว่างอ็อบเจ็กต์และคลาสและโดยทั่วไปแล้วจะใช้การเปลี่ยนแปลงในกรณีที่จะทำเช่นนั้น (ไม่จำเป็นต้องมีเพียงแบบแผน) ดังนั้นobject.method()และObject.Method()ได้รับการยอมรับทันทีว่าเป็นการอ้างอิงและวิธีการอ็อบเจ็กต์และคลาส (หากคุณปฏิบัติตามแบบแผนการเข้ารหัสนั้น) เช่นเดียวกับในภาษาอังกฤษคุณสามารถแยกแยะคำนามที่เหมาะสมและจุดเริ่มต้นของประโยคด้วยตัวพิมพ์ใหญ่ ดังนั้นเมื่ออ่านหรือเขียนโปรแกรมฉันไม่คิดว่าตัวพิมพ์เล็กหรือใหญ่ไม่สำคัญมิฉะนั้นฉันจะขาดความหมายบางอย่างไป
Jason S

@ เจสันทุกอย่างเกี่ยวกับสิ่งที่คุณคุ้นเคย นักศึกษาการเขียนโปรแกรมภาษาซีรุ่นใหม่เสนอข้อร้องเรียนมากมายเกี่ยวกับความอ่อนไหวของตัวพิมพ์เล็กและตัวพิมพ์เล็กในตอนแรกหลังจากนั้นไม่กี่หลักสูตรก็จะคุ้นเคยกับมัน object.method () และ Object.Method () เป็นเพียงแบบแผนและเป็นกรณีที่ดีที่สุดสำหรับความไวของตัวพิมพ์เล็กและใหญ่ ฉันต้องแก้ไขโปรแกรมที่เขียนโดยคนอื่นซึ่งมีตัวแปรสองตัวชื่อ temp และ Temp ในขอบเขตเดียวกันและฉันจะบอกคุณว่ามันยากมากที่จะทำให้มันอยู่ในหัวของฉัน และในขณะที่เราอาจจำคำนามทั่วไปโดยใช้ตัวพิมพ์ใหญ่คำว่า "bob" และ "Bob" มีความหมายเหมือนกันในสมองของเรา
Andrew Neely

เหตุใด IDE จึงสงวนเคสไว้ในกรณีนั้น (ขออภัย) ฉันคิดว่า IDE รักษาเคสเพราะนักออกแบบ MS คิดว่าเคสมีความหมายบางอย่างในสมองซึ่งมันทำ แต่ในความเป็นจริงแล้ว VB IDE พิจารณาformและFormเหมือนกันซึ่งสำหรับฉันแล้วทำให้สับสน ในกรณีที่ (ขออภัยอีกครั้ง) ของtempและTempคุณสามารถจะใช้เครื่องมือ refactoring ใน C # จะเปลี่ยนชื่อTempไปbobTempหรืออะไรก็ตาม อย่างไรก็ตามฉันกำลังรักษา VB บางส่วนและมีคนไปทำDim form As Formแล้ว ตอนนี้เมื่อฉันเปลี่ยนชื่อมันจะเปลี่ยนชื่อทั้งการอ้างอิงคลาสและอ็อบเจ็กต์ Bleah!
Jason S

@ Jason ใน VB ฉันมักจะพูดว่า "Dim aform as Form" แต่ฉันพูดนอกเรื่อง VB รองรับกรณีไวในการค้นหา นอกจากนี้ฉันจะค้นหา "As Form" และแทนที่ด้วย "somethingstupid" จากนั้นเปลี่ยนชื่อแบบฟอร์มเป็นสิ่งที่สมเหตุสมผลจากนั้นเปลี่ยนชื่อ "somethingstupid" กลับเป็น "As Form" จริง ๆ แล้วฉันชอบที่มันเปลี่ยนเคสเพราะมันยืนยันว่าฉันไม่ได้อ้วนกับชื่อตัวแปร
Andrew Neely

ใช่ แต่นี่ไม่สามารถใช้แทนเครื่องมือ refactoring ที่จะแยกความแตกต่างระหว่างการอ้างอิงคลาสและอินสแตนซ์เมื่อชื่อเหมือนกัน (หรือแตกต่างกันไปตามกรณีใน VB) เครื่องมือปรับโครงสร้าง C # ดูเหมือนจะทำได้ ฉันไม่ได้ตั้งชื่อคลาสและอินสแตนซ์เหมือนกัน ใน C # ฉันจะใช้กรณีเพื่อแยกแยะ แต่ใน VB ฉันไม่สามารถทำได้ดังนั้นฉันจึงใช้ตัวอักษรเพื่อนำหน้า เห็นได้ชัดว่าปัญหาของฉันคือฉันกำลังดูแลรหัสของคนอื่นที่ใช้ชื่อเดียวกัน แต่การสนทนานี้ใหญ่เกินไปสำหรับความคิดเห็นดังนั้นฉันจะปล่อยไว้ที่นี่
Jason S

5

นี่เป็นส่วนหนึ่งของโปรแกรมแก้ไขที่คุณใช้ซึ่งอาจทำงานแตกต่างกันไป แต่ความจริงก็คือ Visual Basic เป็นภาษาที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ ดังนั้นssและSSเหมือนกัน

โปรดดูบทช่วยสอนพื้นฐาน VB.NET สำหรับข้อมูลเพิ่มเติม :)


โอ้น่าสนใจ มีที่ไหนบ้างที่ฉันดูรายละเอียดนี้ ฉันยังไม่ได้ทดสอบ แต่คิดถึง VBScript คุณอาจจะพูดถูก
Todd Main

@Otaku: โปรดดูคำตอบของฉันอีกครั้งฉันได้ให้ลิงค์แล้ว ขอบคุณ
Sarfraz

ฉันคุ้นเคยกับ VB มากขอบคุณ :) ฉันไม่แน่ใจว่าคุณต้องการให้ฉันดูอะไรในหน้านั้น
Todd Main

3

ฉันไม่แน่ใจว่าฉันเข้าใจคุณไหม VB ไม่คำนึงถึงขนาดตัวพิมพ์ดังนั้น ss และ SS จึงเป็นตัวแปรเดียวกันดังนั้นคอมไพเลอร์จึงบ่นอย่างถูกต้องว่าคุณประกาศตัวแปรอีกครั้ง

ฉันคิดว่าตัวแปรไม่ได้คำนึงถึงขนาดตัวพิมพ์ แต่เป็นชื่อฟังก์ชัน


แต่ถ้าฉันใช้ssแล้วพิมพ์ในภายหลังSSมันจะได้รับการแก้ไขโดยอัตโนมัติssซึ่งทำให้ฉันเชื่อว่าคอมไพเลอร์ดูแลเคสอย่างแน่นอน
Todd Main

5
@oTAKU: นั่นคือ IDE ที่เปลี่ยนเคสไม่ใช่คอมไพเลอร์
John Saunders

2
VB ยังไม่สนใจเรื่องเคสมากนัก IDE พยายามล้างโค้ดเพื่อให้ตัวแปรยังคงเหมือนเดิมตลอด
guitarthrower

1

ใช่ VB ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ บางครั้งมันก็โยนสิ่งที่ไม่เคยชินให้มันวนซ้ำไปมา


1

เราไม่จำเป็นต้องพยายามอย่างหนักใน VB.NET เพื่อสร้างโค้ดที่มี "การสะกด" ตัวพิมพ์ใหญ่ / เล็กที่แตกต่างกันของตัวระบุ การเปลี่ยนปลอกของตัวระบุในไฟล์ที่มีการประกาศโดยไม่ใช้ฟังก์ชัน "เปลี่ยนชื่อ" จะไม่ทำให้ชื่อถูกอัปเดตในไฟล์อื่นแม้ว่าการแก้ไขบรรทัดใด ๆ ที่มีชื่อจะทำให้เป็นไปตามข้อกำหนดปัจจุบัน

ด้วยวิธีนี้เราสามารถระบุได้ว่า VB.NET ส่วนใหญ่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่ แต่จะทำให้กรณีของตัวระบุพร้อมใช้งานสำหรับ CLR ซึ่งอาจใช้ข้อมูลนั้นในรูปแบบที่คำนึงถึงตัวพิมพ์เล็กและใหญ่


1

ฉันสามารถเสนอสิ่งนี้ได้เท่านั้นซึ่งตามที่ฉันจำได้จากหนังสือเรียนการเขียนโปรแกรมของฉันในช่วงต้นทศวรรษที่ 80 นั้นภาษา Senstive นั้น (ในเวลานั้น) มีวัตถุประสงค์อย่างเคร่งครัดเพื่อลดข้อผิดพลาดในการคอมไพล์ กล่าวคือ "ความเข้มงวด" มีจุดมุ่งหมายเพื่อพัฒนาระเบียบวินัยในการเขียนโค้ดให้มีความแม่นยำมากขึ้น เนื่องจากมีการเพิ่มการติดฉลากที่เหมาะสมของตัวแปรคลาสวิธีการฟังก์ชันและสิ่งอื่น ๆ ที่คุณต้องการจะใส่เข้าไปในนั้นก็ได้รับการพัฒนาเช่นกัน

ฉันจำได้ว่าหนังสือเหล่านั้นเกือบทั้งหมดมีรูปแบบที่แนะนำสำหรับการใช้ตัวพิมพ์ใหญ่ชั้นนำตัวพิมพ์เล็ก ฯลฯ อย่างที่เราทุกคนทราบกันดีว่าหนังสือส่วนใหญ่ถูกโยนทิ้งไปแล้วหรือฉันควรจะพูดว่าละเลยในทางปฏิบัติประหยัดสำหรับโปรดักชั่นเฮาส์ระดับไฮเอนด์และ โซลูชัน CASE หรือสำหรับผู้ที่มีระดับทักษะที่สูงขึ้น ฉันคิดว่าทุกคนมีประสบการณ์ในการเรียนรู้นี้

ด้วยความก้าวหน้าของภาษาและ IDE เหล่านี้คำถามที่ดีกว่าคือภาษาใดช่วยเพิ่มเวลาในการพัฒนาของฉัน แน่นอนว่าหากคุณไม่คุ้นเคยกับการแลงแต่ละแบบตัวเลือกของคุณมี จำกัด


1

ฉันจะพยายามตอบคำถามที่สองของคุณ

"สิ่งนี้น่าสนใจเพียงพอสำหรับฉันที่จะพิจารณาย้ายไปที่ C # หรือไม่หากกรณี VB.NET จำกัด สิ่งที่ฉันสามารถทำได้กับโค้ด"

สร้าง WCF WebService โดยใช้ C # สร้าง DataContract (1 คลาส) หนึ่งที่มีคุณสมบัติ "อีเมลสตริง" อีกอันที่มี "string Email" เป็นคุณสมบัติอื่น คุณเลือกที่จะเข้าใจว่าเป็นอีเมลส่วนตัวหรืออีเมลสำนักงาน หรืออาจเป็น DataContracts สองแบบ

สำหรับ C # ไม่เป็นไร บริการเว็บถูกสร้างขึ้นอย่างดี โปรแกรม AC # สามารถสร้าง WSDL ได้อย่างง่ายดายและทุกอย่างก็เรียบร้อยดี

ตอนนี้ลองสร้าง WSDL ด้วย VB (ทุกรุ่น) มันจะบอกว่า "อีเมล" ประกาศแล้วและการสร้าง WSDL ล้มเหลว

เช่นเดียวกับทุกคนที่ฉันคิดว่านี่เป็นข้อเสียเปรียบในภาษา VB แต่!!!

ใช้ FxCOP และวิเคราะห์รหัส C # ดั้งเดิม FxCOP กล่าวว่าการใช้อีเมล / อีเมลเป็นปัญหา แนะนำให้ใช้ชื่ออื่นที่รองรับกรณีที่ไม่อ่อนไหว โปรดทราบว่า ณ วันที่. NET framework มีภาษาการเขียนโปรแกรม 106 ภาษาและมีหลายภาษาที่เปิดใช้ความไวของตัวพิมพ์เล็กและใหญ่ เราทุกคนกำลังก้าวไปสู่ระบบคลาวด์และต้องการให้บริการของเราสามารถเข้าถึงได้โดยแพลตฟอร์ม / ภาษาการเขียนโปรแกรมทั้งหมด

ดังนั้นการพิจารณาตัวพิมพ์เล็กและตัวพิมพ์ใหญ่จึงเป็นทางเลือกของคุณในโปรแกรมของคุณและถ้าคุณเป็นคน C คุณจะชอบมัน หากโปรแกรมจะถูกใช้ / เข้าถึงโดยโปรแกรมอื่น ๆ ที่ไม่ใช่ C คุณจำเป็นต้องรองรับกรณีไม่ไว แต่ภาษาของคุณเป็นตัวเลือกของคุณ

http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Visual_Basic_.NET http://www.vbrad.com/article.aspx?id=65


ระบบคลาวด์ใช้ URI ซึ่งคำนึงถึงตัวพิมพ์เล็กและใหญ่ (ซึ่งมีความสำคัญโดยเฉพาะกับพร็อกซีและเซิร์ฟเวอร์แคช)
binki

1

การซ่อนสัญลักษณ์ (เช่นเขตข้อมูลการซ่อนในเครื่อง) ยังไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่

นี่คือตัวอย่าง :

Public Class C
    Public Name As String

    Public Function M(name As String) As Boolean
        Return String.Equals(name, Name) ' case differs
    End Function
End Class

เอาต์พุตของคอมไพเลอร์ VB.NET ถูกถอดรหัสเป็น (และเทียบเท่ากับ) C # ต่อไปนี้:

public class C
{
    public string Name;

    public bool M(string name)
    {
        return string.Equals(name, name); // both lowercase
    }
}

string.Equalsถูกส่งผ่านฟิลด์สองครั้ง ท้องถิ่นถูกซ่อนไว้โดยไม่คำนึงถึงกรณี ภาษาไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่

ในการอ้างอิงสมาชิกอย่างชัดเจนเช่นฟิลด์นี้คุณต้องยกเลิกการอ้างอิงสมาชิกผ่านMe:

Return String.Equals(name, Me.Name) ' differentiate field from local

0

ฉันไม่เห็นใครแสดงความคิดเห็นในคำถามที่ 2 ที่ชัดเจนของคุณในตอนท้าย: "2: สิ่งนี้น่าสนใจเพียงพอสำหรับฉันที่จะพิจารณาย้ายไปที่ C # หรือไม่ถ้ากรณี VB.NET จำกัด สิ่งที่ฉันสามารถทำได้ด้วยโค้ด"

ฉันชอบแนวทางตัวเลือกมากกว่าที่ C # ให้โปรแกรมเมอร์เลือกว่าจะไม่ จำกัด ตัวเลือกของโปรแกรมเมอร์ ฉันชอบ C # เป็นอย่างมาก แต่สำหรับความไวของตัวพิมพ์เล็กและใหญ่เพียงอย่างเดียวฉันไม่คิดว่ามันจะใกล้เคียงกับการเรียนรู้ภาษาเพียงเพราะเป็นกรณี ๆ ไป คุณสมบัติทั้งหมดมีความสำคัญอย่างไรและเมื่อฉันดูข้อดีของทั้ง C # และ VB.NET ฉันชอบ C # มาก แต่ฉันจะให้มุมมองที่สมดุลอย่างแท้จริงลำเอียงใช่เพราะฉันมีความชอบ แต่ฉันจะซื่อสัตย์เกี่ยวกับข้อเสียของ C # ด้วย

ก่อนอื่นทั้งสองภาษามีข้อดีและข้อเสีย ความแตกต่างที่คุณสามารถทำได้ในภาษาหนึ่งซึ่งไม่สามารถทำได้ในอีกภาษาหนึ่งนั้นลดน้อยลงเนื่องจาก Microsoft กำลังปรับปรุงทั้งสองภาษาและดูเหมือนว่าจะไม่แสดงความลำเอียงที่ไม่เป็นธรรมต่อภาษาใดภาษาหนึ่ง

เมื่อ C # ออกมาครั้งแรก VB ไม่มีความคิดเห็น XML ที่คุณสามารถใส่ไว้ก่อนวิธีการซึ่งฉันชอบใน C # ฉันเกลียดสิ่งนั้นใน VB.NET แต่ฉันเคยเห็นในช่วงหลายปีที่ผ่านมาว่ามีการเพิ่มคุณลักษณะหลายอย่างที่ไม่ได้อยู่ในภาษาเดียวลงในอีกภาษาหนึ่ง (ทีมนักพัฒนา MS เดียวกันพัฒนาทั้ง C # และ VB ดังนั้นจึงสมเหตุสมผลที่คุณสมบัติควรจะคล้ายกันมาก)

แต่คุณถามว่า C # มีอะไรบ้างที่ VB ไม่มี นี่คือบางส่วนที่ฉันคิดได้ทันที:

1: C # กระชับกว่าและพิมพ์น้อยลง .. ในหลาย ๆ วิธี! ฉันเคยเห็นความโง่เขลาพูดเมื่อมีการอ้างสิทธิ์ในทางตรงกันข้าม VB บันทึกการพิมพ์ แต่โปรดฟังคนที่บอกคุณว่าพวกเขาใช้ทั้งสองภาษาและไม่ค่อยมีใครใช้ ฉันใช้ทั้ง C #และVB, C # ที่บ้านเพราะฉันชอบ (และเมื่อฉันทำงานกับ C # ในที่ทำงาน) และคำของานล่าสุดของฉันที่ฉันใช้ VB ไม่ใช่ C # ดังนั้นฉันจึงใช้ VB บ่อยขึ้นในตอนนี้ (เป็นเวลาประมาณ 10 เดือนแล้ว) แต่จากคำให้การส่วนตัวของฉันฉันชอบ C # มากและในแง่ของการพิมพ์จริง VB นั้นพิมพ์ได้มากกว่ามาก ตัวอย่างหนึ่งที่ฉันเคยอ่านที่มีคนพยายามพูดว่า VB มีความกระชับมากขึ้นคือการให้ตัวอย่าง 'with ... ' ที่มีตัวแปรยาวร่วมด้วยดังนั้นใน VB คุณสามารถใช้ ".property" ได้ นี่คือความโง่เขลาในการอ้างว่า VB ต้องการการพิมพ์น้อยลง มีบางสิ่ง (ไม่ใช่แค่ตัวอย่างนี้) ที่ VB สั้นลง แต่หลาย ๆ ครั้งเมื่อ C # กระชับขึ้นในทางปฏิบัติจริง

แต่เหตุผลที่สำคัญที่สุดที่ฉันเชื่อว่า C # มีความรัดกุมกว่าคือคำสั่ง "IF / THEN" ของ VB ถ้าคำสั่งเป็นเรื่องธรรมดา ใน C # ไม่มีคำว่า 'แล้ว' ให้พิมพ์! :) นอกจากนี้คำสั่ง 'end ... ' ทั้งหมดจะพิมพ์ซึ่งใน c # โดยปกติจะเป็นเพียงวงเล็บปีกกาปิดเดียว '}' ฉันได้อ่านมาว่าบางคนอ้างว่าคำฟุ่มเฟือยมากกว่านี้ใน VB.NET เป็นข้อได้เปรียบของ VB เนื่องจากคำสั่ง / สัญลักษณ์การปิดกั้นหลายรายการสามารถซ้อนกันและจบลงทันทีข้างๆกัน แต่ฉันค่อนข้างไม่เห็นด้วย คน ๆ หนึ่งมักจะเขียนโปรแกรมได้ดีกว่าทั้งใน C # หรือ VB มากกว่าโปรแกรมเมอร์คนอื่นเพราะการแก้ไขโค้ดครั้งต่อไปสามารถออกแบบได้ดีกว่า สิ่งนี้ใช้กับ 'วงเล็บปีกกาปิดจำนวนมากที่สับสนใน C #' บวกหากบล็อกที่ซ้อนกันทั้งหมดเป็นประเภทเดียวกันเช่น IF ที่ซ้อนกันหลายตัว VB จะประสบปัญหาเดียวกันกับที่มีใน C # นี่ไม่ใช่ข้อได้เปรียบใน VB สถานการณ์นี้เป็นเหตุผลว่าทำไมฉันจึงชอบแสดงความคิดเห็นว่าสัญลักษณ์ปิดหรือคำสั่งปิดของฉันใช้กับทั้งสองภาษาอย่างไร ใช่นี่เป็นเรื่องละเอียดกว่าที่ต้องทำ แต่ในภาษาใดภาษาหนึ่งคุณมีตัวเลือกที่จะชัดเจนซึ่งเป็นสิ่งสำคัญในการตัดสินตามสถานการณ์เฉพาะกรณี ฉันคิดว่าความชัดเจนของโค้ดนั้นสำคัญมาก

2: VB ไม่มีความคิดเห็นแบบหลายบรรทัด เมื่อฉันทำงานกับ VB ฉันไม่รังเกียจ จากนั้นฉันก็ไปเรียนภาษา C สองสามภาษา ตอนนี้ฉันกลับมาใช้ VB.NET เป็นส่วนใหญ่ในที่ทำงานและฉันคิดถึงพวกเขา มันเป็นเพียงสิ่งที่คุณสะดวกและต้องเสียไป :(

3: 'andalso' และ 'orelse' ของ VB ค่อนข้างน่ารำคาญในการพิมพ์ทั้งหมดนั้นเมื่ออยู่ใน C # มันเป็นเพียง '&&' และ '||' อีกครั้งพิมพ์น้อยลง นี่ไม่ใช่เรื่องยากในรหัสของฉันทั้งใน VB และ C # หากมีสิ่งใดสำหรับฟังก์ชันการทำงาน 'หรือ' กับ 'OrElse' มักจะไม่สำคัญยกเว้น 'OrElse' จะเร็วกว่าสำหรับคอมพิวเตอร์ดังนั้นหากโปรแกรมเมอร์ใช้ 'หรือ' และ 'และ' ใน VB ก็จะสร้างรหัสที่เหมาะสมน้อยกว่าสำหรับ คนที่ชอบความชัดเจนของรหัส "หรือ" นั้นง่ายกว่าการอ่าน "OrElse" มาก

4: มีความยืดหยุ่นมากขึ้นในการวางโค้ดใน C # เมื่อบรรทัดยาวและคุณต้องการรวมไว้ในบรรทัดถัดไปฉันเกลียดการปรับรหัสของฉัน 'การควบคุม' ของ VB.NET C # ทำเพียงเล็กน้อย แต่ฉันพบว่ามีประโยชน์มากกว่าใน C # โดยที่ใน VB จะควบคุมได้มากกว่า แต่นี่เป็น VB.NET IDE เทียบกับ C # IDE มากกว่าภาษาตัวเอง แต่ฉันไม่รู้ว่าคุณต้องการคุณสมบัติภาษาทั้งสองอย่างหรือล้วนๆโดยไม่มีความแตกต่างของ IDE

5: สิ่งหนึ่งที่ฉันพลาดจริงๆคือแค่สร้างบล็อกโค้ดใหม่ใน C # ฉันอาจมีหลายอย่างเกิดขึ้นในวิธีการและฉันต้องการประกาศตัวแปรในบล็อกโค้ดที่เล็กมาก แต่ไม่มีตัวแปรนั้นที่ประกาศนอกบล็อกนั้นใน วิธีการทั้งหมด ใน C # เราสามารถสร้างบล็อกใหม่โดยใช้ "{" และลงท้ายด้วย "}" VB ไม่มีคุณสมบัติดังกล่าว แต่การจับคู่ที่ใกล้เคียงที่สุดคือบล็อก 'If True Then' และ 'End If' ที่ไม่มีเงื่อนไข (สังเกตอักขระ 2 ตัว C # เทียบกับ 18 อักขระ VB.NET เทียบเท่าอีกครั้ง ... พิมพ์เพิ่มเติมใน VB)

6: ตัวดำเนินการเพิ่มและลดตัวเอง: ++ และ - เช่นเดียวกับmyVariable++หรือ++myVariableหรือเวอร์ชันลดที่เทียบเท่า สิ่งนี้มีประโยชน์มาก ... นี่คือตัวอย่างของรหัสจริงเมื่อฉันพลาด C # อย่างมาก:

// C#:
while (txt.Length > x)
{
    thisChar = txt[x];
    if (charsAllowedWithoutLimit.Contains(thisChar)) { ++x; }
    else if (allowLettersWithoutLimit && char.IsLetter(thisChar)) { ++x; }
    else if ((x2 = charsAllowedWithLimit.IndexOf(thisChar)) >= 0)
    {
        ++x; if (++usedCountA[x2] > charAllowedLimit[x2]) { break; }
    }
    else { break; }
}

' VB.NET:
While (txt.Length > x)
    thisChar = txt(x)
    If (charsAllowedWithoutLimit.Contains(thisChar)) Then
        x += 1
    ElseIf (allowLettersWithoutLimit AndAlso Char.IsLetter(thisChar)) Then
        x += 1
    Else
        x2 = charsAllowedWithLimit.IndexOf(thisChar)
        If (x2 >= 0) Then
            x += 1
            usedCountA(x2) += 1S
            If usedCountA(x2) > charAllowedLimit(x2) Then Exit While
        Else
            Exit While
        End If
    End If
End While

และเพื่อให้เป็นตัวอย่างที่ดีมากสำหรับกฎ C # นี่คือรหัสเพิ่มเติมที่ฉันเขียนเป็นการส่วนตัวเมื่อเร็ว ๆ นี้:

// C#
public static bool IsNotWithin(this Byte   v, Byte   v1, Byte   v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this SByte  v, SByte  v1, SByte  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Int16  v, Int16  v1, Int16  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Int32  v, Int32  v1, Int32  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Int64  v, Int64  v1, Int64  v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this UInt16 v, UInt16 v1, UInt16 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this UInt32 v, UInt32 v1, UInt32 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this UInt64 v, UInt64 v1, UInt64 v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }
public static bool IsNotWithin(this Decimal v, Decimal v1, Decimal v2) { return (v1 > v && v < v2) || (v2 < v && v > v1); }

public static bool IsWithin(this Byte   v, Byte   v1, Byte   v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this SByte  v, SByte  v1, SByte  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Int16  v, Int16  v1, Int16  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Int32  v, Int32  v1, Int32  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Int64  v, Int64  v1, Int64  v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this UInt16 v, UInt16 v1, UInt16 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this UInt32 v, UInt32 v1, UInt32 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this UInt64 v, UInt64 v1, UInt64 v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }
public static bool IsWithin(this Decimal v, Decimal v1, Decimal v2) { return (v1 <= v && v <= v2) || (v2 <= v && v <= v1); }

' And the VB equivalent is a mess! Here goes:
<Extension()>
Public Function IsNotWithin(v As Byte, value1 As Byte, value2 As Byte) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As SByte, value1 As SByte, value2 As SByte) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As Int16, value1 As Int16, value2 As Int16) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

' the % suffix means 'As Integer' in VB.
<Extension()>
Public Function IsNotWithin(v%, value1%, value2%) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

' the & suffix means 'As Long' in VB.
<Extension()>
Public Function IsNotWithin(v&, value1&, value2&) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As UInt16, value1 As UInt16, value2 As UInt16) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As UInt32, value1 As UInt32, value2 As UInt32) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsNotWithin(v As UInt64, value1 As UInt64, value2 As UInt64) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

' the @ suffix means 'As Decimal' in VB.
<Extension()>
Public Function IsNotWithin(v@, value1@, value2@) As Boolean
    Return (value1 > v AndAlso v < value2) OrElse (value2 < v AndAlso v > value1)
End Function

<Extension()>
Public Function IsWithin(v As Byte, value1 As Byte, value2 As Byte) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As SByte, value1 As SByte, value2 As SByte) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As Int16, value1 As Int16, value2 As Int16) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

' the % suffix means 'As Integer' in VB.
<Extension()>
Public Function IsWithin(v%, value1%, value2%) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

' the & suffix means 'As Long' in VB.
<Extension()>
Public Function IsWithin(v&, value1&, value2&) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As UInt16, value1 As UInt16, value2 As UInt16) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As UInt32, value1 As UInt32, value2 As UInt32) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

<Extension()>
Public Function IsWithin(v As UInt64, value1 As UInt64, value2 As UInt64) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

' the @ suffix means 'As Decimal' in VB.
<Extension()>
Public Function IsWithin(v@, value1@, value2@) As Boolean
    Return (value1 <= v AndAlso v <= value2) OrElse (value2 <= v AndAlso v <= value1)
End Function

บางทีนี่อาจเป็นหลักฐานว่า C # มีความรัดกุมมากขึ้น แต่ไม่ใช่โปรแกรมเมอร์ทุกคนที่ชอบความกระชับ บางคนชอบอ่าน "if a <b then ... " เพราะมันเป็นธรรมชาติของภาษามนุษย์มากกว่า และไม่เป็นไร การตั้งค่าเป็นเรื่องปกติ สำหรับฉันความพยายามด้วยมือเป็นปัจจัยที่ฉันให้ความสำคัญและฉันคิดว่าใคร ๆ ก็เคยชินกับการคิดในสัญลักษณ์ใด ๆ ที่พวกเขาต้องการสำหรับ "if" และ "then" เป็นสัญลักษณ์ของตัวอักษรและ C # ของคำสั่ง "if (เงื่อนไข);" ไวยากรณ์เป็นสัญลักษณ์ด้วย อันหนึ่งใกล้เคียงกับไวยากรณ์ของผู้ที่ไม่ใช่โปรแกรมเมอร์มากกว่าอีกอัน ฉันชอบแบบรวบรัด

ฉันยังคิดว่าจำเป็นต้องใช้ 'c' หลังตัวอักษรใน VB เพื่อให้เป็นตัวอักษรตามตัวอักษรแทนที่จะเป็นสตริงนั้นน่ารำคาญ ฉันชอบความกระชับของ C # กับสิ่งนั้นมาก เมื่อเมธอดต้องการอักขระลิเทอรัลคุณต้องระบุอักขระที่ไม่ใช่สตริงที่มีความยาวอักขระเดียวดังนั้นบางครั้งคุณถูกบังคับให้ใช้":"cใน VB ในขณะที่ C # คือ':'มันเป็น ฉันคิดว่านี่เป็นการเลือกที่ดี

เพื่อความเป็นธรรมฉันจะบอกว่ามีข้อดีที่ผมชอบที่จะ VB เช่นไม่ต้องใส่วงเล็บว่างเปล่าหลังจากเรียกวิธีการเช่นDim nameUpper$ = name.ToUpperInvariantที่ C # string nameUpper = name.ToUpperInvariant()ต้องวงเล็บที่ว่างเปล่า หรือสองเท่าเช่นการตัดแต่งมันมากเกินไป: VSDim nameUpper$ = name.Trim.ToUpperInvariant string nameUpper = name.Trim().ToUpperInvariant()ฉันชอบการใช้งานที่กระชับของ VB ว่าฉันใช้อย่างไร$ด้านบนเพื่อหรี่แสง 'As String' โดยที่ C # ไม่มีทางลัดเหล่านั้น VB มีทางลัดสำหรับประเภท String, Integer, Long, Decimal, Single และ Double แต่ข้อเสียคือมันไม่ค่อยชัดเจนดังนั้นฉันจึงใช้ด้วยความระมัดระวัง แต่อย่างไรก็ตามฉันชอบรหัสที่กระชับมากกว่า

นั่นเป็นเพียงคำพูดบางส่วนจากโปรแกรมเมอร์ผู้ช่ำชองและตามที่ฉันพิจารณานี่คือคำให้การในการเขียนโปรแกรมของฉันเกี่ยวกับ C # vs VB ทั้งสองภาษาเป็นภาษาที่ดีในความคิดของฉัน แต่ใช่ฉันยังชอบ C # มาก

ps เนื่องจากฉันวางแผนที่จะเขียนโปรแกรมมาเกือบตลอดชีวิตฉันจึงได้เรียนรู้การพิมพ์ใหม่โดยใช้แป้นพิมพ์ที่มีประสิทธิภาพสูงสุดนั่นคือแป้นพิมพ์ Dvorak ซึ่งใช้ความพยายามในการพิมพ์ภาษาอังกฤษประมาณ 1/3 มากกว่าแป้นพิมพ์ Qwerty ค้นดูสิ. บางทีคุณอาจต้องการเปลี่ยนด้วย ;) มันทำให้การพิมพ์ของฉันง่ายขึ้น 67%! :) ฉันสนับสนุนให้ทุกคนคิดนอกกรอบและประเมินประสิทธิภาพที่ดีขึ้นในงานของคุณ Dvorak Simplified Keyboard Layout และ C # ได้ทำสิ่งนี้ให้ฉันแล้ว :)

PSS ฉันจะเปรียบเทียบ Dvorak และ C # กับเมตริกซึ่งต่างจากรูปแบบแป้นพิมพ์ Qwerty และ VB กับการวัดเชิงประจักษ์ Dvorak, เมตริกและ C # นั้น 'สะอาด' แต่ VB อยู่ไม่ไกลจริงๆ แต่ต้องทนทุกข์ทรมานจากความจำเป็นที่จะต้องเข้ากันได้กับรหัส VB6 เก่าและรหัสก่อน. NET เช่น 'หรือ' เทียบกับ 'OrElse' และ 'IIF ()'

ฉันจบด้วยความระมัดระวัง โปรดใช้ความระมัดระวังมากขึ้นในการรับฟังคนที่ไม่รู้จริงๆว่าพวกเขากำลังพูดถึงอะไร ครึ่งหนึ่งของข้อเสียทั้งหมดต่อทั้ง VB และ C # คือไม่ใช่ปัญหาใด ๆ อีกต่อไปและผู้คนยังคงโพสต์เกี่ยวกับพวกเขาโดยไม่รู้ถึงข้อเสียที่ยังคงมีอยู่ในภาษา ตัวอย่างที่ดีที่สุดที่ฉันคิดได้คือความคิดเห็น XML สำหรับวิธีการที่ใช้เครื่องหมายวรรคตอนสามใน VB หรือสัญลักษณ์ความคิดเห็นสแลชสามตัวใน C # แต่โปรดสังเกตตัวเองว่าคน ๆ นั้นพูดจากความไม่รู้หรือจากประสบการณ์ ประจักษ์พยานส่วนตัวหมายถึงพวกเขารู้จากประสบการณ์จริง และหลังจากที่ใครบางคนมีประสบการณ์มากมายในนั้นแล้วก็จงหูผึ่ง ฉันมีประสบการณ์มากกว่า 10 ปีทั้งใน C # และ VB และมันก็เดือดพล่าน: ทั้งคู่เป็นภาษาที่ดี (มาก) และความแตกต่างส่วนใหญ่คุณจะเห็นได้ทันทีภายใน 5 นาทีหลังจากอ่านโค้ด แต่ใช่คุณสมบัติอื่น ๆ อาจใช้เวลาหลายปีในการหาแต้มต่อ และหนึ่งแต้มต่อที่ฉันรู้ (ใน C #) ฉันทำได้ ' แม้จะคิดถึงสถานการณ์ในชีวิตจริงที่จะเป็นประโยชน์ ดังนั้นบางทีมันอาจไม่ใช่แต้มต่อ

ขอให้สนุกกับการเขียนโค้ด!


ฉันขอขอบคุณในรายละเอียดทั้งหมด แต่ตัวอย่างของคุณไม่ได้ใช้ความอ่อนไหว / ไม่ไวต่อตัวพิมพ์ (เท่าที่ฉันสามารถบอกได้) เพื่อแสดงว่าเหตุใด C # จึง "ดีกว่า"
Todd Main

ฉันพยายามตอบคำถามที่สองด้วยตัวอย่างโดยตรง
Venkat

@ToddMain ถูกต้อง และตัวอย่างของฉันไม่ได้ใช้ความไวของตัวพิมพ์เล็กและใหญ่เพื่อแสดงว่าทำไม C # จึงดีกว่าเพราะคำถามไม่ได้ถามว่าทำไมความไวของตัวพิมพ์เล็กจึงทำให้ดีขึ้น นอกจากนี้ฉันเชื่อว่าคุณลักษณะนี้พูดเพื่อตัวมันเอง และฉันเชื่อว่าตรรกะเป็นพื้นฐานที่คนส่วนใหญ่สามารถอนุมานได้ว่าตัวเอง แต่ถ้ามีคนถามฉันยินดีที่จะช่วยให้พวกเขาก้าวผ่านตรรกะ แต่นั่นเพื่อนของฉันในความคิดของฉันเป็นคำถามที่แตกต่างออกไป ;)
Shawn Kovac

อันที่จริงนั่นเป็นหนึ่งในสองคำถามที่ถามในโพสต์เดิม มันไม่ชัดเจนในตัวเองนี่คือเหตุผลที่ฉันถาม แต่ไม่ต้องกังวลเกี่ยวกับการไม่ตอบคำถาม
Todd Main

@ToddMain ฉันเห็นประเด็นของคุณ จุดที่ยุติธรรมมากแน่นอน :) ขอบคุณสำหรับการเปิดตาของฉันกับสิ่งนี้ :)
Shawn Kovac

0

VB.NET ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่

ตัวอย่าง:

1

Dim a As Integer
Dim A as Integer

2

Sub b()
    'Some statement(s) here
End Sub
Sub B()
    'Some statement(s) here
End Sub

3

Function c() As Integer
    'Some statement(s) here
End Function
Function C() As Integer
    'Some statement(s) here
End Function

เหล่านี้รหัสทั้งหมดจะโยนข้อผิดพลาดเวลารวบรวม

สำหรับตัวอย่างที่ 1 ข้อผิดพลาดจะปรากฏขึ้นโดยระบุว่า "ตัวแปรท้องถิ่น" A "ได้รับการประกาศแล้วในบล็อกปัจจุบัน"

ในขณะที่ตัวอย่างที่ 2 และ 3 จะแสดงข้อผิดพลาดโดยระบุว่า "'Public Sub b ()' มีคำจำกัดความหลายคำที่มีลายเซ็นเหมือนกัน" และ "'Public Function c () As Integer' มีคำจำกัดความหลายคำที่มีลายเซ็นเหมือนกัน" ตามลำดับ

จากข้อผิดพลาดเหล่านี้โปรดทราบว่าข้อผิดพลาดจะเกิดขึ้นในตำแหน่งที่แตกต่างกันสำหรับตัวแปรและขั้นตอน / ฟังก์ชัน สำหรับตัวแปรข้อผิดพลาดจะเกิดขึ้นที่การประกาศครั้งที่ 2 ในขณะที่สำหรับโพรซีเดอร์ / ฟังก์ชันจะถูกส่งไปที่การประกาศครั้งที่ 1 / คำจำกัดความของโค้ดที่เหมือนกัน

ดังที่ผู้ใช้กล่าวไว้ในความคิดเห็นข้างต้นรหัส VB.NET จะได้รับการตรวจสอบอย่างต่อเนื่องและ / หรือแก้ไขในพื้นหลัง คุณสามารถเห็นข้อผิดพลาดนี้ในหน้าต่าง "รายการข้อผิดพลาด" ใน VS IDE และเนื่องจากนี่เป็นข้อผิดพลาดและไม่ใช่คำเตือนโค้ดจะไม่คอมไพล์จนกว่าข้อผิดพลาดจะได้รับการแก้ไข

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.