ฉันจะใช้คุณลักษณะ C # 6“ การใช้แบบคงที่” ได้อย่างไร?


123

ฉันมีลักษณะที่คู่ของเป็นคุณสมบัติใหม่ใน C # 6 โดยเฉพาะ "ใช้คงที่"

การใช้ staticเป็นรูปแบบใหม่ของการใช้ประโยคที่ให้คุณนำเข้าสมาชิกแบบคงที่ไปยังขอบเขตได้โดยตรง
(ด้านล่างของบล็อกโพสต์)

แนวคิดมีดังนี้ตามแบบฝึกหัดสองสามข้อที่ฉันพบ
แทนที่จะเป็น:

using System;

class Program 
{ 
    static void Main() 
    { 
        Console.WriteLine("Hello world!"); 
        Console.WriteLine("Another message"); 
    } 
}

คุณสามารถละเว้นConsoleคำสั่งซ้ำได้โดยใช้คุณลักษณะ C # 6 ใหม่ในการใช้คลาสแบบคงที่:

using System.Console;
//           ^ `.Console` added.
class Program 
{ 
    static void Main() 
    { 
        WriteLine("Hello world!"); 
        WriteLine("Another message"); 
    } // ^ `Console.` removed.
}

อย่างไรก็ตามสิ่งนี้ดูเหมือนจะไม่ได้ผลสำหรับฉัน ฉันได้รับข้อผิดพลาดในusingข้อความแจ้งว่า:

" using namespaceคำสั่งA ' ' สามารถใช้ได้กับเนมสเปซเท่านั้น ' Console' เป็นประเภทที่ไม่ใช่เนมสเปซลองใช้using staticคำสั่ง '' แทน"

ฉันใช้ Visual Studio 2015 และตั้งค่าเวอร์ชันภาษาบิวด์เป็น"C # 6.0"

สิ่งที่ช่วยให้? ตัวอย่างของบล็อก msdn ไม่ถูกต้องหรือไม่? ทำไมถึงไม่ทำงาน


ขณะนี้บล็อกโพสต์ได้รับการอัปเดตเพื่อแสดงการอัปเดตล่าสุด แต่นี่คือภาพหน้าจอในกรณีที่บล็อกหยุดทำงาน

บล็อก

คำตอบ:


177

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

using static System.Console;
//      ^
class Program 
{ 
    static void Main() 
    { 
        WriteLine("Hello world!"); 
        WriteLine("Another message"); 
    } 
}

จากนั้นโค้ดของคุณจะคอมไพล์


โปรดทราบว่าใน C # 6.0 staticนี้งานจะสำหรับสมาชิกเท่านั้นประกาศให้เป็น

ตัวอย่างเช่นพิจารณาSystem.Math:

public static class Math {
    public const double PI = 3.1415926535897931;
    public static double Abs(double value);
    // <more stuff>
}

เมื่อusing static System.Mathคุณสามารถใช้Abs();.
แต่คุณยังจะต้องคำนำหน้าเพราะมันไม่ได้เป็นสมาชิกแบบคงที่:PIMath.PI;

เริ่มต้นด้วย C # เวอร์ชัน 7.2 ไม่ควรเป็นเช่นนั้นconstค่าเช่นPIสามารถใช้ได้เช่นกัน


3
ฉันมีปัญหาที่คล้ายกัน แต่โดยSystem.Mathเฉพาะอย่างMath.PIยิ่ง เมื่อฉันใช้using static System.Mathวิธีการเช่นเดียวกับSqrt()การทำงาน PIแต่ไม่คงที่เช่น ฉันต้องเขียนต่อไม่งั้นMath.PIโค้ดไม่คอมไพล์ ฉันสงสัยว่าทำไมถึงไม่ได้ผล ฉันควรส่งคำถามใหม่สำหรับสิ่งนี้หรือไม่
skwear

5
@skwear: ดูเหมือนจะเป็นเนื้อหาสำหรับคำถามใหม่ใช่
Cerbrus

1
ในฐานะที่เป็นคำตอบอย่างรวดเร็วคำถาม @ skwear ของ: "ใช้คงเป็นชนิดใหม่ของการใช้ประโยคที่ช่วยให้คุณนำเข้าแบบคงที่สมาชิก < ... >" PIไม่ใช่สมาชิกคงที่ของMathชั้นเรียน มันคงที่ เพียงแค่ใส่: staticสมาชิกจะต้องมีการประกาศให้เป็น
Cerbrus

3
ดูเหมือนเป็นโอกาสสำหรับไวยากรณ์ใหม่เช่นusing const System.Math;:)
Filip Skakun

1
ตัวอย่างในเอกสารของ Microsoft ที่อ้างสิทธิ์ PI สามารถใช้ได้โดยไม่มีคำนำหน้า: docs.microsoft.com/en-us/dotnet/csharp/language-reference/…
Guney Ozsan

1

staticคำหลักในusingคำสั่งจะนำเข้าเพียงหนึ่งชนิดที่กำหนด (และมันเป็นประเภทที่ซ้อนกัน) นอกจากนี้คุณต้องไม่ระบุชื่อประเภทอีกต่อไป ดังนั้นเพียงแค่เพิ่มคงที่ในการใช้งานของคุณ

หมายเหตุ: โปรดใช้คุณสมบัตินี้เฉพาะเมื่อทั้งสองคลาสมีความสัมพันธ์กันอย่างใกล้ชิดอย่างมีเหตุผลมิฉะนั้นจะทำให้การอ่านโค้ดค่อนข้างยาก


"ต้องไม่ให้ชื่อประเภท"หมายความว่ายังไง? ฉันทำอย่างนั้นที่ไหน
Cerbrus

Thobias ฉันไม่ได้รวมทั้งสองอย่างเข้าด้วยกัน
Cerbrus

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