1. Trang chủ
  2. » Công Nghệ Thông Tin

C# và các lớp cơ sở System.object ppt

9 412 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 9
Dung lượng 115,54 KB

Nội dung

chúng ta biết rằng đó là lớp cơ sở chung mà mọi đối tượng khác được thừa kế và ta cũng xem xét về các phương thức thành viên chính của nó.tuy nhiên,trong chương trước ta chưa tìm hiểu kỉ

Trang 1

C# và các lớp cơ sở System.object

Trong chương 3 , chúng ta đã xem xét về system.object chúng ta biết rằng

đó là lớp cơ sở chung mà mọi đối tượng khác được thừa kế và ta cũng xem xét về các phương thức thành viên chính của nó.tuy nhiên,trong chương trước ta chưa tìm hiểu kỉ về khả năng của tất cả các phương thức,(chúng ta chỉ mới tìm hiểu chi tiết những phương thức tostring() và finalize() ).trong chương này ta sẽ tìm hiểu các phương thức còn lại của system.object đầu tiên ta sẽ tìm hiểu tóm tắt của từng phương thức :

Phương thức Truy xuất Mục đích

string ToString()

public virtual

Trả về 1 chuỗi đại diện cho đối tượng

int GetHashCode() public trả về mã băm của đối tượng được

Trang 2

virtual thiết kế cho phép ta tìm kiếm 1

cách hiệu quả các thể hiện của đối tượng trong từ điền

bool Equals(object obj)

public virtual

so sánh đối tượng này với 1 đối tượng khác

bool Equals(object objA,

object objB)

public static

so sánh 2 đối tượng

bool ReferenceEquals(object

objA, object objB)

public static

so sánh các tham chiếu đối tượng

để xem chúng có chỉ đến cùng đối tượng

Type GetType() public

trả về 1 đối tượng dẫn xuất từ System.Type mà đưa ra chi tiết kiểu dữ liệu

object MemberwiseClone() protected

Makes a shallow copy of the object (in other words, copies data in the object but not other objects any fields refer to)

void Finalize() protected Hàm hủy ( Destructor)

Trang 3

virtual

4 trong những phương thức này khai báo là ảo ( virtual) vì vậy ta có thể overload chúng

Các thành viên của system.object:

ToString() - đây là cách trình bày chuỗi dễ dàng nhanh chóng và cơ bản

được dùng trong tình huống khi bạn muốn phác hoạ nhanh nội dung của một đối tượng,chẳng hạn để vá lỗi nếu bạn muốn trình bày chuỗi phức tạp hơn bạn có thể dùng interface IFormatable

GetHashcode() - hữu ích nếu đối tượng được đặt trong cấu trúc dữ liệu map

( hay còn gọi là bảng băm hoặc từ điển).Nó được dùng bởi những lớp mà thao tác những cấu trúc này để quyết định nơi đặt đối tượng trong cấu trúc .nếu bạn định lớp của bạn được sử dụng như là khoá trong từ điển, thì bạn sẽ cần overload GetHashcode()

Equals() ( cả 2 phiên bản) và ReferenceEquals()- có những khác biệt tinh

vi giữa 3 kiểu phương thức này, đi cùng với toán tử so sánh ,==.ta sẽ xem xét sau

Finalize() - đây là 1 destructor và được gọi khi một đối tượng tham chiếu là

rác được thu nhặt để dọn dẹp tài nguyên thực sự thì finalize() không làm gì

Trang 4

cả , bị bỏ qua bởi bộ gom rác, nhưng điều này không đúng với các overload

ta nên overload chỉ khi cần thiết.overload Finalize() trong C# không được làm tường minh ( điều này hay gây ra lỗi biên dịch) bằng cách cung cấp destructor destructor đưọc chuyển bởi trình biên dịch thành phươngg thức Finalize()

GetType() - phương thức này trả về thể hiện của một lớp được dẫn xuất từ

System.type đối tượng này có thể cung cấp một số thông tin mở rộng về lớp

mà đối tượng là thành viên, bao gồm kiểu cơ sở, phương thức , thuộc tính

MemberWiseClone() - đây chỉ là thành viên của System.Object mà ta

không đi sâu trong cuốn sách này nó đơn giản tạo một bản sao của đối tượng và trả về 1 tham khảo đến bản sao.lưu ý rằng bản sao được tạo như là bản sao bóng- nghĩa là nó sao chép tất cả các kiểu giá trị trong lớp.nếu lớp chứa đựng những tham khảo kèm theo thì chỉ có tham khảo được sao chép ,không phải là đối tượng

So sánh các đối tượng tham chiếu tương đương

Ta thấy rằng trong C# có đến 4 kiểu so sánh tương đương ( gồm 3 phương thức so sánh và 1 toán tử = ) ta sẽ tìm hiểu sự khác nhau giữa các loại so sánh này

ReferenceEquals()

Trang 5

Tên của phương thức chính là ý nghĩa của nó nó kiểm tra 2 tham chiếu liệu

có quy vào cùng một thể hiện của một lớp:rằng 2 tham chiếu này chứa đựng cùng một địa chỉ trong bộ nhớ hay không.ReferenceEquals() luôn trả về true nếu được cung cấp 2 tham tham chiếu cùng quy vào một thể hiện đối tượng

và sai nếu khác tuy nhiên nó xem null là bằng null

SomeClass x, y;

x = new SomeClass();

y = new SomeClass();

bool B1 = ReferenceEquals(null, null); // trả về true

bool B2 = ReferenceEquals(null,x); // trả về false

bool B3 = ReferenceEquals(x, y); // trả về false bởi x và y trỏ đến 2 đối tượng khác nhau

Phương thức ảo Equals()

Ảo, một phiên bản thể hiện của Equals() có thể được xem như là đối nghịch với ReferenceEquals() Đúng là phương thức Equals() làm việc bằng cách so sánh những tham chiếu phương thức này được cung cấp trong trường hợp

ta muốn nạp chồng nó để so sánh giá trị của những thể hiện đối tượng.cụ thể ,nếu ta dự định thể hiện của lớp được sử dụng như khoá trong từ điển, ta cần nạp chồng phương thức để so sánh giá trị nếu không thì tuỳ thuộc vào cách

Trang 6

ta nạp chồng GetHashCode(), lớp từ điển chứa đựng những đối tượng của ta cũng không làm việc hoàn toàn, hoặc là làm việc thiếu khả năng.1 điểm mà

ta chú ý khi nạp chồng Equals() là việc nạp chồng của ta sẽ không bao giờ tung ra biệt lệ

Phương thức static Equals()

Phương thức static Equals() thực sự thì cũng giống như phiên bản phương thức ảo Equals().điểm khác là phương thức static có thể đối phó khi đối tượng là null, và do đó cung cấp 1 kiểu bảo vệ an toàn chống lại việc tung ra biệt lệ nếu đối tượng có thể là null.phương thức này đầu tiên sẽ kiểm tra khi overload thì tham chiếu được truyền có phải là null không.nếu cả hai là null, thì nó trả về true, ( vì null được xem là bằng null) nếu chỉ có một cái là null

nó trả về false.nếu cả hai tham chiếu thực sư quy đến một thứ,thì nó gọi phiên bản thể hiện ảo của Equals() nghĩa là khi bạn nạp chồng bản thể hiện của equals() ,kết quả cũng như bạn nạp chồng lên bản static

Toán tử so sánh (==)

Toán tử so sánh có thể được xem như là bản trung gian giữa việc so sánh giá trị và việc so sánh tham chiếu thường viết :

bool b = (x == y); // x, y là đối tượng tham chiếu

Trang 7

nghĩa là ta đang so sánh 2 tham chiếu tuy nhiên,chấp nhận rằng có 1 vài lớp

mà ý nghĩa của nó trực quan hơn nếu xem nó như là một giá trị.trong trường hợp đó, tốt hơn hết là nạp chồng toán tử so sánh thành so sánh giá trị ví dụ như là những chuỗi mà microsoft nạp chồng toán tử này, bởi vì khi các nhà phát triển nghĩ đến việc so sánh chuỗi, họ luôn nghĩ rằng phải so sánh nội dung của chuỗi hơn là so sánh tham chiếu

Nếu ta muốn nạp chồng những hàm so sánh và Object.GetHashCode() cần lưu ý những hướng dẫn sau:

không nên nạp chồng chỉ 1 Object.Equals() hay Object.GetHashCode() nếu

ta nạp chồng cái naỳ thì cũng phải nạp chồng cái kia.bởi vì việc thực thi từ điển đòi hỏi cả 2 phương thức hoạt động đồng nhất ( nếu Obkect.Equals() làm việc so sánh giá trị,thì GetHashCode() cũng nên xây dựng mã dựa trên giá trị.)

Nếu ta nạp chồng toán tử == , thì phải nạp chồng Object.Equals() ( và vì vậy cũng nạp chồng object.GetHashCode() ) bởi vì nếu == so sánh giá trị , thì object Equals() cũng so sánh giá trị

So sánh các kiểu giá trị trong equal

Khi so sánh kiểu giá trị trong equal , nguyên tắc cũng giống như kiểu tham chiếu :ReferenceEquals() được dùng để so sánh tham chiếu, Equals() được

Trang 8

dùng cho so sánh giá trị, và toán tử so sánh được xem như trường hợp trung gian.tuy nhiên sự khác biệt ở đây là kiểu giá trị cần được bỏ vào hộp ( boxed ) để chuyển thành kiểu tham chiếu.do đó microdoft nạp chồng phương thức Equals() vào lớp System.ValueType để cung cấp ý nghĩa tương đương đến kiểu giá trị.nếu ta gọi sA.Equals(sB) ,sA,sB là thể hiện của một vài Struct, thì giá trị trả về sẽ là true hoặc false tuỳ theo liệu sA và sB chứa đựng cùng giá trị trong tất cà các trường mặt khác, không có việc nạp chồng == bằng mặc định trong stuct riêng của ta.Viết ( sA==sB) trong bất kì biểu thức nào thì đều bị lỗi trừ khi ta cung cấp 1 overload == vào mã trong Struct

1 điểm khác là ReferenceEquals() luôn trả về false khi ứng dụng vào kiểu giá trị, bởi vì để gọi phương thức, kiểu giá trị sẽ cần bỏ vào hộp thành đối tượng thậm chí nếu ta viết :

bool b = ReferenceEquals(v,v); // v là biến của một vài kiểu giá trị

Ta sẽ có câu trả lời là false bởi vì v sẽ được đóng hộp riêng rẽ khi chuyển mỗi thông số,nghĩa là ta sẽ có sự tham chiếu khác nhau.Gọi referenceEquals() để so sánh kiểu giá trị không phải là 1 sự chọn lựa hay Mặc dù nạp chồng mặc định của Equals() cung cấp bởi System.ValueType hầu như chắc chắn tương thích với số lượng lớn cấu trúc mà ta định nghĩa ,ta

có thể muốn nạp chồng nó lần nữa theo ý riêng của ta để cải thiện việc thực thi.nếu 1 kiểu giá trị chứa kiểu tham chiếu như 1 trường,ta có thể muốn nạp

Trang 9

chồng Equals() để cung cấp ngữ nghĩa tương đương cho những trường này, mặc định thì Equals() đơn giản sẽ so sánh điạ chỉ của chúng

Ngày đăng: 30/07/2014, 18:20

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w