Sự khác biệt giữa từ khóa is và as


121

Vui lòng cho biết sự khác biệt giữa isastừ khóa trong C #



3
Nếu bạn quan tâm đến chủ đề này, bạn có thể cũng muốn biết sự khác biệt giữa toán tử "as" và "cast": blogs.msdn.com/b/ericlippert/archive/2009/10/08/…
Eric Lippert

7
Bạn có muốn đánh dấu câu trả lời được chấp nhận không? Nó sẽ giúp những người khác đang tìm kiếm câu trả lời tương tự.
KMån

Câu trả lời:


151

Các isnhà điều hành kiểm tra nếu một đối tượng có thể được đúc đến một loại hình cụ thể.

Thí dụ:

if (someObject is StringBuilder) ...

như

Các asnhà điều hành cố gắng đúc một đối tượng đến một loại hình cụ thể, và trở thành vô giá trị nếu nó không thành công.

Thí dụ:

StringBuilder b = someObject as StringBuilder;
if (b != null) ...

Cũng liên quan:

Vật đúc

Các nhà điều hành đúc nỗ lực để đúc một đối tượng đến một loại hình cụ thể, và ném một ngoại lệ nếu nó không thành công.

Thí dụ:

StringBuilder b = (StringBuilder)someObject.

4
Điều này không chính xác. iskhông kiểm tra xem một đối tượng có thể được truyền đến một kiểu cụ thể hay không. Một số nguyên có giá trị dài nhưng 10 is longsai.
Martin Smith

9
@MartinSmith: Bạn đang trộn lẫn chuyển đổi kiểu với truyền. Một số nguyên có thể được chuyển đổi thành long, nhưng không thể chuyển nó thành long vì nó không dài.
Guffa

2
Bạn đang nói với tôi rằng một số nguyên không thể được truyền thành dài? Điều đó (long)some_integersẽ thất bại? Tôi khá chắc rằng cả hai chúng tôi đều biết điều đó là không đúng mà không cần chạy nó, vì vậy hãy giải thích ý bạn.
Martin Smith

12
@MartinSmith: Bạn vẫn đang nhầm lẫn giữa truyền với chuyển đổi. Bạn không truyền một số nguyên thành một giá trị dài, bạn đang chuyển một số nguyên thành một giá trị dài. Mặc dù chúng sử dụng cùng một cú pháp, các tham chiếu được ép kiểu và các giá trị được chuyển đổi.
Guffa

2
Lưu ý vềis : " Lưu ý rằng toán tử is chỉ xem xét chuyển đổi tham chiếu, chuyển đổi quyền anh và chuyển đổi mở hộp. Các chuyển đổi khác, chẳng hạn như chuyển đổi do người dùng xác định, không được xem xét. " (Msdn.microsoft.com/en-us/library/scekt9xw .aspx). Giới thiệu vềas : " Lưu ý rằng toán tử as chỉ thực hiện các chuyển đổi tham chiếu, chuyển đổi nullable và chuyển đổi quyền chọn. Toán tử as không thể thực hiện các chuyển đổi khác, chẳng hạn như chuyển đổi do người dùng xác định, thay vào đó sẽ được thực hiện bằng cách sử dụng biểu thức truyền. " ( ép Msdn .microsoft.com / en-us / library / cscsdfbt.aspx )
user1234567

33

Sự khác biệt giữa ISAs là vậy ..

Toán tử IS - Is được sử dụng để kiểm tra tính tương thích của một đối tượng với một loại đã cho và nó trả về kết quả là một Boolean (Đúng hoặc Sai).

Toán tử AS - As được sử dụng để truyền đối tượng tới một loại hoặc một lớp nhất định.

Ví dụ.

Student s = obj as Student;

tương đương với:

Student s = obj is Student ? (Student)obj : (Student)null;

1
Sự tương đương rõ ràng cho thấy cái nào trong hai cái nào nguyên thủy hơn và làm nền tảng cho mối quan hệ của họ một cách tao nhã! Cảm ơn vì sự tương đương!
Musa Al-hassy

1
@ MusaAl-hassy Thực ra điều này không cho thấy cái nào nguyên thủy hơn. iscó thể được diễn đạt với asascó thể được diễn đạt với is. Đây là cách tạo một isvới astừ khóa. Bool b = obj is Student; tương đương với: Bool b = (obj as Student) != null; Nhiều hơn về vấn đề này ở đây
Alex Telon

8

Cả hai isas từ khóa được sử dụng để truyền kiểu trong C #.

Khi bạn xem mã IL về cách sử dụng của cả hai từ khóa, bạn sẽ dễ dàng nhận ra sự khác biệt.

Mã C #:

BaseClass baseclassInstance = new DerivedClass();
DerivedClass derivedclassInstance;

if (baseclassInstance is DerivedClass)
{
   derivedclassInstance = (DerivedClass)baseclassInstance;
   // do something on derivedclassInstance
}


derivedclassInstance = baseclassInstance as DerivedClass;

if (derivedclassInstance != null)
{
   // do something on derivedclassInstance
}

Mã IL (đối với C # trên có trong hình ảnh đính kèm):

Mã IL cho mã C # trên Mã IL để issử dụng từ khóa chứa các hướng dẫn IL cả isinstacastclass.
Nhưng mã IL để assử dụng từ khóa chỉ có isinsta.

Trong cách sử dụng đã đề cập ở trên, hai kiểu chữ sẽ xảy ra khi istừ khóa được sử dụng và chỉ một lần đánh máy ở nơi astừ khóa được sử dụng.

Lưu ý: Nếu bạn đang sử dụng istừ khóa để kiểm tra một số điều kiện và không quan tâm đến kết quả typecast, thì sẽ chỉ có một typecast, tức là

if (baseclassInstance is DerivedClass)
{
   // do something based on the condition check.
}

isascác từ khóa sẽ được sử dụng dựa trên sự cần thiết.


6

Từ khóa is kiểm tra xem giá trị ở bên trái của nó có phải là một thể hiện của loại ở bên phải hay không. Ví dụ:

if(obj is string)
{
     ...
}

Lưu ý rằng trong trường hợp này, bạn sẽ phải sử dụng thêm một diễn viên rõ ràng để lấy obj dưới dạng chuỗi.

Từ khóa as được sử dụng để ép kiểu nullable. Nếu giá trị được chỉ định không phải là một thể hiện của kiểu được chỉ định, giá trị null sẽ được trả về. Ví dụ:

string str = obj as string;
if(str != null)
{
     ...
}

+1 cho "Từ khóa as được sử dụng để ép kiểu nullable."
user2330678

3

Tôi sẽ nói: đọc MSDN trực tuyến, nhưng đây là:

Toán tử is kiểm tra xem một đối tượng có tương thích với một kiểu nhất định hay không và kết quả đánh giá là kiểu Boolean: true hay false.

Toán tử as sẽ không bao giờ ném ra một ngoại lệ.


Toán tử "as" cũng sẽ không ném ra một ngoại lệ, nó sẽ chỉ trả về null.
Pinte Dani

Đã sửa lỗi đánh máy liên quan đến 'is' và 'as'
Patrick Peters

2

Là toán tử, một ép kiểu, trả về true nếu nó thành công. Nó trả về false nếu quá trình ép kiểu không thành công. Với nó, bạn không thể nắm bắt biến được chuyển đổi. Toán tử này hữu ích nhất khi kiểm tra các kiểu trong câu lệnh if và biểu thức. Is-cast chỉ lý tưởng nếu biến kết quả không cần thiết để sử dụng thêm

Như là một dàn diễn viên. Với nó, chúng tôi đạt được hiệu suất và tránh các trường hợp ngoại lệ khi diễn viên không hợp lệ. Null được trả về khi không thể cast. Đối với các loại tham chiếu, nên sử dụng as-cast. Nó vừa nhanh vừa an toàn, chúng tôi có thể kiểm tra biến kết quả so với null và sau đó sử dụng nó. Điều này giúp loại bỏ phôi thừa


2
  1. là toán tử kiểm tra xem đối tượng có tương thích với kiểu đã cho hay không, kết quả dựa trên true hay false.
  2. như được sử dụng để truyền một kiểu này sang kiểu khác và khi chuyển đổi thất bại kết quả là rỗng ngoại trừ sau đó tăng ngoại lệ. cũng xem liên kết để hiểu rõ hơn với các ví dụ https://blogs.msdn.microsoft.com/prakasht/2013/04/23/difference-between-direct-casting-is-and-as-operator-in-c/

2

là OPERATOR Toán tử is trong C # được sử dụng để kiểm tra kiểu đối tượng và nó trả về giá trị bool: true nếu đối tượng cùng kiểu và false nếu không. hoặc cũng có thể Sử dụng toán tử “is” để kiểm tra xem kiểu thời gian chạy của một đối tượng có tương thích với một kiểu nhất định hay không. Đối với các đối tượng null, nó trả về false, ví dụ:

if(obj is AnimalObject)
{
 //Then Work
}

với tư cách là NGƯỜI ĐIỀU HÀNH

Toán tử as thực hiện công việc tương tự của toán tử is nhưng sự khác biệt là thay vì bool, nó trả về đối tượng nếu chúng tương thích với kiểu đó, nếu không, nó trả về null. Nói cách khác, toán tử 'as' được sử dụng để thực hiện chuyển đổi giữa các đối tượng tương thích các loại.

ví dụ

Type obj = Object as Type;

Ưu điểm của as over Trong trường hợp là toán tử, để nhập kiểu ép kiểu, chúng ta cần thực hiện hai bước:

Check the Type using is
If its true then Type cast

Trên thực tế, điều này ảnh hưởng đến hiệu suất vì mỗi lần CLR sẽ đi qua hệ thống phân cấp kế thừa, kiểm tra từng loại cơ sở so với loại được chỉ định.

Để tránh điều này, hãy sử dụng as, nó sẽ thực hiện trong một bước. Chỉ để kiểm tra loại, chúng ta nên sử dụng toán tử is.


Trả lời các câu hỏi 8 tuổi đã có nhiều câu trả lời hợp lệ không phải là cách tốt nhất để sử dụng Stack Overflow.
Claus Jørgensen,

1

Toán tử As tương tự như một phép ép kiểu, nhưng trả về null thay vì một ngoại lệ nếu nó không thành công.

Và toán tử Is được sử dụng để kiểm tra xem một đối tượng có tương thích với một kiểu nào đó hay không. Nó thường được sử dụng trong câu lệnh If.


1

is: Toán tử is được sử dụng để kiểm tra xem kiểu thời gian chạy của một đối tượng có tương thích với một kiểu nhất định hay không

as: Toán tử as được sử dụng để thực hiện chuyển đổi giữa các kiểu tương thích.

object s = "this is a test";
string str=string.Empty;
if( s is string)
    str = s as string;

2
Câu trả lời của bạn là đúng, nhưng mã mẫu của bạn là mẫu chống. Đó là tốn kém để làm issau đó as: nó unboxes hai lần. Đối với các kiểu tham chiếu, bạn chỉ nên làm as, sau đó kiểm tra null để xem nó có hoạt động hay không.
Steven Sudit,

1

Hãy xem video youtube bên dưới để giải thích sự khác biệt theo cách trực quan và dễ hiểu hơn: -

https://www.youtube.com/watch?v=IKmRtJcRX_I

Dưới đây là câu trả lời dài với giải thích mã.

Từ khóa "IS" hữu ích để kiểm tra xem các đối tượng có tương thích với một loại hay không. Ví dụ: trong đoạn mã dưới đây, chúng tôi đang kiểm tra xem đối tượng “ocust” có phải là một loại lớp “Khách hàng” hay không.

object ocust = new Customer();

if (ocust is Customer)
{ 

Từ khóa "AS" giúp thực hiện chuyển đổi từ loại này sang loại khác. Ví dụ trong đoạn mã dưới đây, chúng tôi đang chuyển đổi đối tượng thành kiểu dữ liệu chuỗi. Nếu từ khóa “AS” không thể nhập kiểu thì nó sẽ trả về NULL.

object o = "somestring";
string str = o as string;

1
MyClass myObject = (MyClass) obj;

vs

MyClass myObject = obj as MyClass;

Thứ hai sẽ trả về null nếu obj không phải là MyClass, thay vì ném một ngoại lệ của lớp.

là sẽ chỉ trả về true hoặc false


1

Cả IS và AS đều được sử dụng để đúc kiểu an toàn

IS Keyword -> kiểm tra xem loại đối tượng nhất định có tương thích với loại đối tượng mới hay không. Nó không bao giờ ném một ngoại lệ. Đây là kiểu Boolean.. trả về true hoặc false

`student stud = new student(){}
if(stud is student){} // It returns true // let say boys as derived class
if(stud is boys){}// It returns false since stud is not boys type
 //this returns true when,
student stud = new boys() // this return true for both if conditions.`

AS Keyword: kiểm tra xem kiểu của một đối tượng nhất định có tương thích với kiểu đối tượng mới hay không. Nó trả về không phải null nếu đối tượng đã cho tương thích với đối tượng mới, ngược lại là null .. Điều này ném ra một ngoại lệ.

`student stud = new student(){}
 // let say boys as derived class
boys boy = stud as boys;//this returns null since we cant convert stud type from base class to derived class
student stud = new boys()
boys boy = stud as boys;// this returns not null since the obj is pointing to derived class`

1

Cả hai nhà điều hành được sử dụng để đúc kiểu an toàn.

Nhà điều hành AS:

Toán tử AS cũng kiểm tra xem kiểu của một đối tượng nhất định có tương thích với kiểu đối tượng mới hay không. Từ khóa này sẽ kiểm tra xem loại đối tượng nhất định có tương thích với loại đối tượng mới hay không. Nếu nó không tương thích với cái mới thì nó sẽ trả về NULL.

Nhà điều hành IS:

Toán tử này kiểm tra xem kiểu của một đối tượng có tương thích với đối tượng mới hay không. Nếu nó tương thích, nó trả về true, ngược lại là false.


Bạn không nghĩ rằng nó là một chút quá muộn như 4 năm?
Soner Gönül

Ohh yes ... Xin lỗi .... Tôi mới vào stackoverflow rất ít mà thoát ... Không nhận ra Ngày đăng ...
Tukaram

Một đóng góp là một đóng góp! Cảm ơn bạn đã chỉ ra các từ khóa "An toàn đánh máy"! :-)
Musa Al-hassy
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.