Hỏi về get set trong c#

Cám ơn a @Phan_Hoang nhé. Cứ thắc mắc từ bữa giờ. Bây giờ thì e đã hiểu rồi :heart_eyes:

1 Like

Nói chung, vẫn có 2 trường phái:

  • Cần setter /getter (capsulation) cho các just-in-case sau này. Vì có thể đâu mỗi mình viết code, còn đồng nghiệp, …, mình tạo skeleton để bọn nó viết vào.
  • Đek cần, cứ public mà chiến.

Mình theo trường phái ở giữa ^^ Nếu mỗi mình dùng thì public, còn nếu viết cùng / cho thì có setter / getter.

2 Likes

Cái hơn là just-in-case, nhưng cũng phải trade-off nhiều thứ phết. Bạn đọc link mình gửi phía trên xem

Trong này còn có link, tại sao không nên dùng inherit (từ khóa extend)

Nói chung, đọc cho vui, còn làm thế nào thì … mình thấy ổn là được. “Best practice” không phải là “swiss knife” cho mọi trường hợp, thậm chí nhiều “best practice” hại nhiều hơn lợi ^^

2 Likes

Sau này bạn sẽ gặp những chỗ dùng Property thì rất dễ nhưng biến public thì không :blush:

Dạo này làm Java thấy nhớ {get; set;} kinh khủng. C# nó có kiểu viết getter với setter ngắn thế khá tiện, đỡ phải mất công nghĩ tên hàm, code lại ngắn, đẹp và sáng sủa.

E ko phải chính gốc là dân IT, e mới học về cái này, khi e đọc các cmt ở trên thì cũng rút ra được cái, nếu sai mong a góp ý thêm.

  1. Khi mình viết mà muốn nó can lộ lộ phè phè ra thì sẽ viết kiểu ntn luôn.
public double Myint2;
  1. Còn khi mà muốn che giấu ko cho người khác xem code thì ko chơi kiểu auto-properties mà viết rõ ràng ntn luôn.
private double myint2;
public double Myint2
            {
                get { return myint2; }
                set { myint2 = value; }  //mình có thể thêm các điều kiện vào set nếu bài toán cần.
            }

P/s: Có gì chưa hợp lý mong a góp ý thêm.

Viết kiểu 2 thì nó cũng can lộ lộ. Nó chỉ khác khi cho thêm một số từ khoá private, protected vào trước get hoặc set, hoặc xoá get hoặc set.

2 Likes

Mà e cũng chưa hiểu là giấu ở đây là mình giấu cái gì ạ, vì rõ ràng code là mình thấy, người khác dùng code thì người ta cũng nhìn như mình.

2 Likes

Không đâu bạn, chưa chắc người khác đã nhìn thấy code đâu, bạn thử tìm xem hàm Console.WriteLine() viết như thế nào đi :stuck_out_tongue:

3 Likes

Với đoạn code 1 thì bất kỳ thằng nào cũng có thể truy cập và thay đổi giá trị. Thế thì sẽ có trường hợp vô tình hay hữu ý mà set cho biến một giá trị không phù hợp làm chương trình chạy sai logic.

Quay trở lên đoạn code 2. Cái nó muốn dấu là myint2.
Muốn đụng vào myin2 đều phải thông qua get (lấy giá trị) và set (đặt giá trị).
Tại đây người ta phân quyền cho get set hoặc thêm nhiều lệnh để can thiệp vào quá trình get set. Tức là người ra đã dựng thêm một cái khiên che chắn cho myint2.

Giấu ở đây là giấu với những đối tượng khác trong chương trình chứ không phải giấu với người lập trình.

5 Likes

3 posts were split to a new topic: Trong C# có phương thức nào để nội suy tuyến tính 1 chiều hoặc 2 chiều không?

Hi ! Cho em hỏi tại sao trong trường hợp này getter không lấy được giá trị 9999 mà ra luôn 0. Cảm ơn

 class Program
{
    private int abc;
    public int kmn { set; get; }
    public Program()
    {
        this.abc = 9999;
    }
    static void Main(string[] args)
    {
        Program obj = new Program();
        Console.WriteLine(obj.kmn); // kết quả ra 0
    }
}

Cho mình hỏi cái:
kmnabc nó liên quan với nhau thế nào vậy?

Giống như bạn hỏi: “@SITUVN.gcd ơi! Bạn tên thật là gì?”
Mình trả lời: “Tên của @ltdLê Trần Đạt.”
Có liên quan?

5 Likes

À em hiểu rồi, phải như này mới đúng

     class Program
{      
    public int kmn { set; get; }
    public Program()
    {
        kmn = 9999;
    }
    static void Main(string[] args)
    {
        Program obj = new Program();
        Console.WriteLine(obj.kmn); // kết quả ra 9999
    }
}

do em gọi kmn ngay lớp hiện tại nên có thể để private, nhưng nếu tạo đối tượng và gọi kmn ở class khác thì phải để modified là public nếu dùng { set; get; } hả anh ?

Bạn phải để là public nếu muốn gọi từ lớp khác, nhưng bạn cũng có thể tùy biến theo mục đích bạn muốn dùng.

// Chỉ cho lấy (get) mà không cho gán (set):
public int kmn {get; private set;}

// Chỉ cho gán mà không lấy:
public int kmn {private get; set}

//Thay vì mặc định, abc và kmn có liên quan với nhau.
private int abc;
public int kmn{
    get{
        return abc;
    }
    set{
        abc = value;
    }
}
// public, protected, private, 
5 Likes

Anh ơi vậy khi này kmn có còn là thuộc tính nữa không hay thành hàm rồi. hay kmn vừa là thuộc tính vừa là hàm ? thanks a

Ở trong C#, hàm là hàm, thuộc tính là thuộc tính.
Trong C#, thuộc tính có get, set, cách khai báo sử dụng cũng tách biệt so với hàm, method.
Không giống một số ngôn ngữ phải mang 2 cái method ra rồi tự ngầm định với nhau là chúng là một cặp, là property.

5 Likes

OOP không gọi nó là hàm, nó là phương thức.
Qua Java mà xem, thuộc tính chính là phương thức đấy.

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?