mọi người cho em hỏi với ạ, đoạn code dưới của em, em có gán psTich=ps1, rồi thực hiện với psTich, tại sao ps1 cũng bị thay đổi giá trị ạ ??? em cảm ơn ạ
Hỏi về class c#
psTich và ps1 tương tự như List1 và List2 trong câu hỏi thời ấy của mình
Nói kỹ hơn thì psTich
và ps1
chỉ là tham chiếu, là “cái tên”, còn đối tượng thật của nó ta gọi là X.
Bạn có thể hình dung 1 tham chiếu bao gồm 2 phần: phần “tên” (“ps1” chẳng hạn) và phần “dữ liệu” (đối tượng có kiểu dữ liệu PhanSo, nằm ở ô nhớ có địa chỉ 0x54ab632c chẳng hạn)
Đối số của một phép toán là Đối tượng. Việc truy cập tới đối tượng được thực hiện thông qua “tên”.
Phép toán gán = là phép toán gán đối tượng ở vế phải cho tham chiếu ở vế trái. Hay chính xác hơn là trỏ phần “dữ liệu” của tham chiếu vào đối tượng ở vế phải.
Xét câu lệnh sau:
var ps1 = new PhanSo();
new PhanSo()
là một đối tượng (ta gọi nó là X1). Vì nó là “new” cho nên nó không trùng với bất kỳ một đối tượng nào đã tồn tại trong chương trình. Phép gán trên làm cho ps1 trỏ đến X1.
var psTich = ps1;
ps1 là một tham chiếu. Vì ps1 đang trỏ đến X1 nên X1 là đối tượng đóng vai trò đối số của phép toán ở vế phải. Phép gán trên làm cho psTich trỏ đến X1. Vậy cả ps1 và psTich đều đang trỏ đến X1, hay là X1 hiện đang có 2 cái tên mà thôi.
Khi mà cả ps1 và psTich đều là X1, bạn có gọi psTich.TuSo = ps1.TuSo;
cũng không khác gì gọi psTich.TuSo = psTich.TuSo;
, gán một biến bằng giá trị của chính nó
Nói thêm: thông tin trên chỉ đúng với các kiểu dữ liệu dạng Class. Các kiểu dữ liệu dạng struct sẽ bị copy khi gán:
vậy là giờ mình chỉ gán được từng phần trong class 1 thôi đúng ko ạ? vd
psTich.Tuso=ps1.Tuso;
psTich.Mauso=ps1.Mauso;
Đúng rồi bạn
psTich = new PhanSo();
psTich.Tuso = ps1.Tuso;
psTich.Mauso = ps1.Mauso;
Hoặc ổn hơn thì bạn nên viết nó dưới dạng struct
Các kiểu dữ liệu int, bool, char… trong C# được coi như struct nên tuân thủ tính chất trên.
Riêng thằng string là class nhưng lại thể hiện như struct do C# implement string theo cách riêng.
em cảm ơn nhiều ạ !!