2009-07-24 31 views
42

Tôi mới tham gia C# và học từ mới. Tôi thấy khó hiểu được ý nghĩa của hai từ này khi nói đến lập trình C#. tôi nhìn vào từ điển cho ý nghĩa và đây là những gì tôi nhận: "Cái gì đó là tiềm ẩn được thể hiện một cách gián tiếp"rõ ràng và tiềm ẩn C#

Implicit

"Nếu chất lượng hoặc yếu tố tiềm ẩn trong nội dung nào đó, nó liên quan đến nó hoặc được hiển thị bởi nó;"

Explicit

"Cái gì đó là rõ ràng được thể hiện hoặc thể hiện rõ ràng và công khai, mà không cần bất kỳ nỗ lực để che giấu bất cứ điều gì"

"Nếu bạn là rõ ràng về điều gì đó, bạn nói về nó rất cởi mở và rõ ràng. "

Tôi muốn hiểu điều đó trong C#.

Cảm ơn sự giúp đỡ của bạn.

Cheers


thông tin bổ sung:

Đây là một phần của câu trong cuốn sách những gì tôi đang đọc bây giờ có từ này "ngầm"

"Đây phương tiện rằng Khu vực và Người cư ngụ bên trong AreaPerPerson()hoàn toàn tham chiếu đến các bản sao của các biến được tìm thấy trong đối tượng gọi ra AreaPerPerson() "

Tôi không hiểu câu này ở đây đang cố gắng nói gì.

+0

có lẽ tôi chưa bao giờ gặp phải chúng. Nhưng bạn đang nói về bối cảnh nào? Tôi chưa bao giờ nghe nói về rõ ràng và ngầm được áp dụng trong C# trước đây. –

+0

Thật vậy, đưa ra một loạt các câu trả lời có nhiều ngữ cảnh trong C#. –

+0

Việc sử dụng "ngầm" trong văn bản bạn trích dẫn cũng giống như bí ẩn đối với bạn như đối với tôi. Nó có thể có ý nghĩa trong bối cảnh đó, nhưng nó chắc chắn không phải là một thuật ngữ từ ngôn ngữ lập trình C# chung. – reinierpost

Trả lời

85

Các từ khóa implicitexplicit từ khóa trong C# được sử dụng khi khai báo toán tử chuyển đổi. Hãy nói rằng bạn có lớp sau đây:

public class Role 
{ 
    public string Name { get; set; } 
} 

Nếu bạn muốn tạo ra một mới Role và gán một Name với nó, bạn thường sẽ làm điều đó như thế này:

Role role = new Role(); 
role.Name = "RoleName"; 

Kể từ khi nó chỉ có một thuộc tính, có lẽ sẽ thuận tiện nếu chúng ta có thể thay thế nó như thế này:

Role role = "RoleName"; 

Điều này có nghĩa là chúng ta muốn impl icitly chuyển đổi một chuỗi thành Role (vì không có dàn diễn viên cụ thể nào tham gia vào mã). Để đạt được điều này, chúng tôi thêm một nhà điều hành chuyển đổi ngầm:

public static implicit operator Role(string roleName) 
{ 
    return new Role() { Name = roleName }; 
} 

lựa chọn khác là để thực hiện một nhà điều hành chuyển đổi rõ ràng:

public static explicit operator Role(string roleName) 
{ 
    return new Role() { Name = roleName }; 
} 

Trong trường hợp này, chúng ta không thể mặc nhiên chuyển đổi một chuỗi thành một Role, nhưng chúng ta cần phải đúc nó trong mã của chúng tôi:

Role r = (Role)"RoleName"; 
+0

cảm ơn vì đã giải thích. khi nào chúng ta sử dụng cái này? – tintincutes

+6

@tintincute: Rất hiếm khi! Chuyển đổi tùy chỉnh chỉ thỉnh thoảng hữu ích, giống như các toán tử do người dùng xác định. –

+1

ví dụ điển hình, + đồng ý với jon. – tim

44

Nói chung

  • Ngầm định: một cái gì đó đã được thực hiện cho bạn tự động.
  • Rõ ràng: bạn đã viết điều gì đó trong mã nguồn để cho biết bạn muốn điều gì xảy ra.

Ví dụ:

int x = 10; 
long y = x; // Implicit conversion from int to long 
int z = (int) y; // Explicit conversion from long to int 

ngầm và rõ ràng được sử dụng khá nhiều trong những bối cảnh khác nhau, nhưng ý nghĩa chung sẽ luôn là dọc theo những đường.

Lưu ý rằng đôi khi cả hai có thể kết hợp với nhau.Ví dụ:

int x = 10; 
long y = (long) x; // Explicit use of implicit conversion! 

(Một chuyển đổi rõ ràng là một trong đó được quy định rõ ràng; một phiên bản tiềm ẩn là một trong đó thể được sử dụng ngầm, tức là không có mã phải ghi rõ điều đó.)

+0

Sẽ không phải là 'var' als là một bối cảnh tốt đẹp của ngầm và rõ ràng gõ ở đây? ẩn 'var impl = new {Field1 =" EUR ", Field2 = 9.40};' và rõ ràng với định nghĩa lớp 'public class Conversion {string Field1 {get; bộ; } public double Field2 {get; bộ; }} 'và gán ' Chuyển đổi expl = new Conversion(); expl.Field1 = "EUR"; expl.Field2 = 9.40; ' – Independent

+0

@Jonas: Tôi không thực sự chắc chắn những gì bạn đang nhận được ở đây, tôi sợ. –

+0

Okey, tôi dùng thử mới. 'var' được coi là" biến được nhập ngầm "trong C#? – Independent

1

Rõ ràng trong C# chủ yếu là hiển thị ý định của bạn một cách rõ ràng và rõ ràng.

Ví dụ:

class MyClass 
{ 
    string myField; 

    void MyMethod(int someNumber) 
    { 

    } 
} 

Trong đoạn mã trên khả năng hiển thị của lớp, trường và phương pháp đều ngụ ý. Chúng sử dụng mặc định của trình biên dịch.

Bây giờ, tôi không bao giờ có thể nhớ mặc định của trình biên dịch là gì, và có thể đồng nghiệp của bạn không thể, thay vì dựa vào mọi người nhớ những gì mặc định, bạn có thể rõ ràng.

public class MyClass 
{ 
    private string myField; 

    public void MyMethod(int someNumber) 
    { 
    } 
} 
2

Tôi nghĩ rằng việc chuyển đổi ẩn là khá rõ ràng - đó là nơi bạn không cần phải bỏ giá trị một cách rõ ràng trong một bài tập. Vì vậy, thay vì làm

myDigit = (Digit) myDouble 

... bạn có thể chỉ cần làm:

myDigit = myDouble; 
7

Cân nhắc bạn có hai lớp:

internal class Explicit 
{ 
    public static explicit operator int (Explicit a) 
    { 
     return 5; 
    } 
} 


internal class Implicit 
{ 
    public static implicit operator int(Implicit a) 
    { 
     return 5; 
    } 
} 

và hai đối tượng:

var obj1 = new Explicit(); 
var obj2 = new Implicit(); 

bây giờ bạn có thể viết:

int integer = obj2; // implicit conversion - you don't have to use (int) 

hay:

int integer = (int)obj1; // explicit conversion 

nhưng:

int integer = obj1; // WON'T WORK - explicit cast required 

chuyển đổi ngầm được hiểu là đã sử dụng khi chuyển đổi không mất bất kỳ độ chính xác nào. Chuyển đổi rõ ràng có nghĩa là bạn có thể mất một số độ chính xác và phải nêu rõ rằng bạn biết mình đang làm gì.

Ngoài ra còn có ngữ cảnh thứ hai trong đó áp dụng thuật ngữ ngầm định/rõ ràng - triển khai giao diện. Không có từ khóa nào trong trường hợp đó.

internal interface ITest 
{ 
    void Foo(); 
} 

class Implicit : ITest 
{ 
    public void Foo() 
    { 
     throw new NotImplementedException(); 
    } 
} 

class Explicit : ITest 
{ 
    void ITest.Foo() // note there's no public keyword! 
    { 
     throw new NotImplementedException(); 
    } 
} 

Implicit imp = new Implicit(); 
imp.Foo(); 
Explicit exp = new Explicit(); 
// exp.Foo(); // won't work - Foo is not visible 
ITest interf = exp; 
interf.Foo(); // will work 

Vì vậy, khi bạn sử dụng giao diện rõ ràng, phương pháp của giao diện không hiển thị khi bạn sử dụng loại bê tông. Điều này có thể được sử dụng khi giao diện là giao diện trình trợ giúp, không phải là một phần của trách nhiệm chính của lớp và bạn không muốn các phương thức bổ sung gây hiểu lầm cho người nào đó sử dụng mã của bạn.

0

Có thể ngụ ý ngầm định, nhưng rõ ràng có nghĩa là bạn phải tự mình thực hiện. Giống như với phôi. Dưới đây là một diễn viên tiềm ẩn:

int implicit; 
implicit = 7.5; 

Giá trị '7,5' sẽ được ngầm sử dụng làm int. Điều này có nghĩa là trình biên dịch thực hiện nó cho bạn.

Đây là rõ ràng:

int explicit; 
explicit = (int)7.5; 

Ở đây bạn nói với trình biên dịch mà bạn muốn nó đúc. Bạn tuyên bố rõ ràng chuyển đổi. Hy vọng rằng sẽ giúp. Nguồn: http://cboard.cprogramming.com/cplusplus-programming/24371-implicit-explicit.html

Các vấn đề liên quan