Vui lòng cho biết sự khác biệt giữa is
và as
từ khóa trong C #
Vui lòng cho biết sự khác biệt giữa is
và as
từ khóa trong C #
Câu trả lời:
Các is
nhà đ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) ...
Các as
nhà đ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:
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.
is
khô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 long
sai.
(long)some_integer
sẽ 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.
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 )
Sự khác biệt giữa IS và As 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;
is
có thể được diễn đạt với as
và as
có thể được diễn đạt với is
. Đây là cách tạo một is
với as
từ 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
Cả hai is
vàas
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 mã C # trên có trong hình ảnh đính kèm):
Mã IL để is
sử dụng từ khóa chứa các hướng dẫn IL cả isinsta
và castclass
.
Nhưng mã IL để as
sử 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 is
từ khóa được sử dụng và chỉ một lần đánh máy ở nơi as
từ khóa được sử dụng.
Lưu ý: Nếu bạn đang sử dụng is
từ 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.
}
is
và as
các từ khóa sẽ được sử dụng dựa trên sự cần thiết.
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)
{
...
}
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ệ.
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
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 it’s 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.
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;
is
sau đó 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.
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;
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`
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.