Làm cách nào để sử dụng tính năng “Sử dụng tĩnh” của C # 6?


123

Tôi đang xem xét một vài tính năng mới trong C # 6, cụ thể là "sử dụng tĩnh" .

using static là một loại mệnh đề using mới cho phép bạn nhập trực tiếp các thành viên tĩnh của các loại vào phạm vi.
(Cuối bài đăng trên blog)

Ý tưởng như sau, theo một vài hướng dẫn tôi tìm thấy,
Thay vì:

using System;

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

Bạn có thể bỏ qua Consolecâu lệnh lặp lại bằng cách sử dụng tính năng C # 6 mới của việc sử dụng các lớp tĩnh:

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

Tuy nhiên, điều này dường như không hiệu quả với tôi. Tôi gặp lỗi trong usingcâu lệnh, nói rằng:

" using namespaceChỉ có thể áp dụng lệnh" '' cho vùng tên; ' Console' là một kiểu không phải vùng tên. Hãy xem xét một lệnh ' using static' thay thế "

Tôi đang sử dụng visual studio 2015 và tôi đã đặt phiên bản ngôn ngữ xây dựng thành "C # 6.0"

Đưa cái gì? Ví dụ của blog msdn không chính xác? Tại sao điều này không hoạt động?


Bài đăng trên blog hiện đã được cập nhật để phản ánh các cập nhật mới nhất, nhưng đây là ảnh chụp màn hình trong trường hợp blog bị sập:

Blog

Câu trả lời:


177

Có vẻ như cú pháp đã thay đổi một chút kể từ khi những bài đăng trên blog đó được viết. Như thông báo lỗi gợi ý, hãy thêm staticvào câu lệnh include của bạn:

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

Sau đó, mã của bạn sẽ được biên dịch.


Lưu ý rằng, trong C # 6.0, điều này sẽ chỉ hoạt động đối với các thành viên được khai báo là static.

Ví dụ, hãy xem xét System.Math:

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

Khi nào using static System.Math, bạn có thể sử dụng Abs();.
Tuy nhiên, bạn vẫn sẽ phải tiền tố PIvì nó không phải là một thành viên tĩnh: Math.PI;.

Bắt đầu với C # phiên bản 7.2, điều này không nên xảy ra, constcác giá trị như PIcũng có thể được sử dụng.


3
Tôi đang gặp vấn đề tương tự, nhưng thay vào đó System.Math, cụ thể là Math.PI. Khi tôi sử dụng using static System.Math, các phương thức giống như Sqrt()hoạt động nhưng không phải là một hằng số như PI. Tôi phải tiếp tục viết Math.PIhoặc mã không biên dịch. Tôi tò mò là tại sao điều này không hoạt động. Tôi có nên gửi một câu hỏi mới cho việc này không?
quần áo mặc nhà 22/09/2016

5
@skwear: nghe có vẻ giống như tài liệu cho một câu hỏi mới, đúng vậy.
Cerbrus

1
Như một câu trả lời nhanh cho câu hỏi của @ skwear: "sử dụng static là một loại mệnh đề sử dụng mới cho phép bạn nhập các thành viên tĩnh <...>" . PIkhông phải là thành viên tĩnh của Mathlớp. Đó là một hằng số. Nói một cách đơn giản: thành viên phải được khai báo là static.
Cerbrus

3
Âm thanh giống như một cơ hội cho một cú pháp mới như: using const System.Math;:)
Filip Skakun

1
Ví dụ trong Microsoft tuyên bố tài liệu PI có thể được sử dụng mà không tiền tố: docs.microsoft.com/en-us/dotnet/csharp/language-reference/...
Guney Ozsan

1

Các statictừ khoá trong một usingtuyên bố sẽ nhập khẩu chỉ có một, loại nào đó (và đó là loại lồng nhau). Hơn nữa, bạn không được cung cấp tên loại nữa. Vì vậy, chỉ cần thêm tĩnh vào việc sử dụng của bạn.

Lưu ý: Vui lòng chỉ sử dụng tính năng này khi hai lớp có liên quan chặt chẽ với nhau về mặt logic, nếu không, việc đọc mã khá khó khăn.


"bạn không được cung cấp tên loại" Ý bạn là gì? Tôi đã làm điều đó ở đâu?
Cerbrus

Thobias, tôi không kết hợp cả hai ở đâu cả.
Cerbrus

@Cerbrus Ồ ngữ cảnh của 'như bạn đã làm' vô tình thay đổi, sẽ khắc phục điều đó
Tobias Brohl
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.