Uncategorized

Attached Behaviors

AB_Overview

Thêm hành vi cho các đối tượng control nào đó mà bản thân nó không được framework chưa định nghĩa sẵn. Đặc biết khi sử dụng mô hình MVVM khi viết các sự kiện cho control thì phải viết trực tiếp trong code behind.

 

Advertisements
Uncategorized

Visual C# 6.0 new features

1.Expression Bodied Methods

Với các phương thức chỉ với 1 dòng code với C# 6.0 bạn đơn giản chỉ cần tạo 1 Expression Bodied member với chỉ 1 biểu thức không sử dụng dấu ngoặc và trả về tường minh

class Program

    {

        static void Main(string[] args)

        {

            var t = CongNhan.LuongTheoThang(50);

            Console.WriteLine(t);

            Console.ReadLine();

        }

    }

    class CongNhan

    {

        // Phương thức với chỉ 1 biểu thức

        public static int LuongTheoThang(int luongTheoNgay)

                => luongTheoNgay*30;

    }

2. Kiểm tra điều kiện Null

Ở các phiên bản trước chúng ta phải kiểm tra điều kiện Null một cách tường minh, với C# 6.0


class Program
{
static void Main(string[] args)
{
CongNhan2 cn2 = new CongNhan2 { Ten="Hoang" };
LayTenCN2(cn2);
Console.ReadLine();
}

// kiểm tra trạng thái null tường minh
public static void LayTenCN1(CongNhan2 cn)
{
string tenCN = "NA";
if (cn!=null) tenCN=cn.Ten;
Console.WriteLine(tenCN);
}

public static void LayTenCN2(CongNhan2 cn)
{
string tenCn = cn?.Ten??"NA";
Console.WriteLine(tenCn);
}
}
class CongNhan2
{
public string Ten { get; set; }
}

3. Tự động khởi tạo thuộc tính

Tự động khởi tạo thuộc tính cho phép lập trình viên khởi tạo thuộc tính mà không sử dụng private set hoặc cần thiết cho biến cục bộ


class CongNhan3
{
public List ChuyenMon { get; } = new List { "Xây dựng", "Thiết kế" };
}

 

Uncategorized

Delegate trong C#

Trong lúc đợi Visual Studio update một số tính năng mới, mình viết 1 số kiến thức về delagate trong C# cho các bạn còn rối trong vấn đề này.

Một delegate giống như một “người đại diện” hay “đại sứ”. Một delegate có thể được dùng để tạo một bao đóng (encapsulation) cho bất kì phương thức nào, miễn là nó phù hợp (kiểu trả về, tham số). Là một “đại sứ”, delegate có thể triệu gọi phương thức bất kì nơi nào: từ đối tượng này đến đối tượng kia, từ thread này sang thread kia,… Đây là đặc điểm chính của delegate, bạn sẽ cần nhớ lại điều này khi giải quyết các vấn đề thường gặp như truyền dữ liệu giữa hai Form, xử lý lỗi “Cross-thread operation not valid”, tạo event, …

Ngoài ra, bởi vì là một đối tượng, delegate có thể được truyền vào làm tham số của các phương thức. Bạn có thể hiểu đơn giản: delegate là một đối tượng dùng để bao đóng một hoặc nhiều phương thức (Multicast), hay có thể coi delegate là một sự kết hợp giữa đối tượng và phương thức.

Ta sẽ học cách sử dụng delegate qua 3 bước:

  •  Khai báo
  •  Khởi tạo
  • Thực thi

    Khai báo

    Là một đại diện của phương thức và là một kiểu dữ liệu, cách khai báo delegate giống như một sự kết hợp giữa khai báo đối tượng và phương thức. Một delegate được khai báo theo cú pháp sau:

    [modifier] delegate return-type Identifier ([formal-parameters])

    Trong đó:

    • modifier: phạm vi truy xuất (public, private, protected, internal)
    • delegate: từ khóa
    • return-type: kiểu dữ liệu trả về
    • Identifier: định danh của delegate
    • formal-parameters: danh sách các tham số hình thức

    Các phần trong cặp ngoặc vuông [] là tùy chọn.

    Ví dụ:

    public delegate int DoSomething(int x, int y)

    Khai báo một delegate có tên DoSomething, bạn có thể dùng delegate này đại diện cho bất kì phương thức nào yêu cầu hai tham số kiểu int và trả về kiểu int.

    Khởi tạo

    Giả sử  ta có một phương thức sau, có kiểu trả về và tham số tương ứng với delegate DoSomething trên:

    int Add(int x,int y)
    {
    return x+y;
    }

    Khởi tạo delegate từ một phương thức có sẵn, bạn cần truyền phương thức mà delegate sẽ đại diện vào trong constructor. Bạn có thể khởi tạo delegate theo một trong hai cách sau. Chúng tương đương nhau khi được biên dịch:

    // cách 1
    DoSomething myDelegate = new DoSomething(Add)

    // cách 2
    DoSomething myDelegate = Add;

    Hoặc sử dụng tên đầy đủ của phương thức:

    DoSomething obj = MyNamespace1.Program.Add;

    Thay vì tạo phương thức Add() trên, bạn có thể sử dụng anonymous method hoặc lambda expression để tạo đối tượng:

    // anonymous method
    DoSomething obj = delegate(int x,int y){
    return x+y;
    };

    // lambda expression
    DoSomething obj = (x,y) => x+y;

    Thực thi

    Có hai cách để bạn thực thi delegate.

    Coi delegate như một phương thức:

    myDelegate(a, b)

    và như một đối tượng, bằng cách gọi phương thức Invoke():

    myDelegate.Invoke(a, b)

    Ví dụ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class Program
    {
        public delegate int DoSomething(int x,int y);
        public static void Main(string[] args)
        {
            Math m=new Math();
            DoSomething obj = (x,y)=>x+y;
            int value=obj(3,4);
            Console.WriteLine(value); // output: 7
            Console.ReadKey();
        }
    }
Uncategorized

Kiểu con trỏ trong C#

Trong C# cũng hỗ trợ kiểu con trỏ như trong c++ trong biến con trỏ trong c# phải đặt trong unsafe code và khi debug project phải chọn cho phép debug unsafe code
ví dụ:

int x = 100;
int y =200;
int* p1 = &x; //p1 trỏ vào địa chỉ của x
int* p2 = &y; // p2 trỏ vào địa chỉ thanh ghi của y
Console.WriteLine((int)p1); // in địa chỉ của x;
Console.WriteLine(*p1); in giá trị của địa chỉ x;