Hiển thị các bài đăng có nhãn C# Advanced. Hiển thị tất cả bài đăng
Hiển thị các bài đăng có nhãn C# Advanced. Hiển thị tất cả bài đăng

Chủ Nhật, 6 tháng 5, 2012

// // Leave a Comment

Vấn đề Explicit Interface C#

 Khi cài một hoặc nhiều interface theo cách khai báo tường minh (explicit implimentation), thì mặc nhiên các thành viên trong lớp đó có mức độ truy cập (access modifier) được đặt là private. Và khi đó ta không thể thêm hoặc thay đổi chúng.

 Ví dụ một trường hợp với thông báo lỗi của trình biên dịch là: The modifier 'public' is not valid for this item

namespace Test.InterfaceLib
{

    public class Customer : IMember
    {
        public string IMember.PrintName() //Error Here...
        {
            return this.GetType().Name + " called from interface i1";
        }
    }

    public interface IMember
    {
        string PrintName();
    }

    interface IUser
    {
        string PrintName();
    }
}

Giống như trong khi định interface, tất cả các thành viên của nó mặc định là public. Nếu cố add thêm 1 từ khóa (private, public, protected, internal) là điều không hợp lệ và ta gặp một lỗi tương tự như trên.

Read More

Thứ Tư, 29 tháng 6, 2011

// // Leave a Comment

Mã hóa XOR - Phép mã hóa đơn giản - C#

Mã hóa Exclusive-OR là phép mã hóa đối xứng sử dụng hàm đại số boolean XOR. Do tính đối xứng cả hai encryptor và decryptor phải biết được khóa mã, trong khi thuật toán xử dụng thật đơn giản, gần như là không thể phá vỡ.

Các vấn đề thực ta phải quan tâm: Dễ bị khớp mẫu, nhưng điểm yếu này có thể tránh được thông qua việc nén trước thông tin (để có thể loại bỏ các mẫu).  Một số điều lưu ý:
1. XOR áp dụng cho 1 chuỗi văn bản không là thuật toán mã hóa mạnh.
2. Mã hóa thông tin trong ứng dụng XML dễ bị đụng độ với các ký tự chuẩn trong XML
3. Nếu cần mã hóa mạnh, KHÔNG sử dụng thuật toán XOR đơn thuần. Cần có các hệ mật mã an toàn đang được sử dụng (DES, TDES, AES, RC4, RC6, IDEA .. RSA, Elgamal, hệ mật sắp ba lô, hệ mã tuyến tính [n, k, d], ...) hoặc cần được sử dụng phức hợp.

Read More

Thứ Sáu, 18 tháng 3, 2011

// // Leave a Comment

Loại bỏ các dấu tiếng về dạng không dấu C#

Đoạn codesnippet dưới đây cho phép chuyển chuỗi văn bản tiếng việt về dạng không dấu sử dụng C# kết hợp với Regex.
Bảng chữ cái tiếng việt
Các bước thực hiện như sau:
1. Sử dụng Regex tìm tất cả các ký tự tiếng việt có dấu
2. Thay thế ký tự vừa tìm được bởi ký tự tiếng việt không dấu tương ứng
3. Lặp tìm hết các ký tự có dấu trong bảng chữ cái tiếng việt
Read More
// // Leave a Comment

Mã không an toàn trong C#

1. Managed & Unmanaged code

- Managed code là mã được thực thi dưới sự giám sát cửa CLR(Common Language Runtime). CLR có nhiệm vụ giống như là 1 lao công, như:
  • Quản lý bộ nhớ cho các đối tượng
  • Xác minh kiểu đang được thực thi
  • Thu gom rác (các biến mà chúng ta bầy bừa ra trong quá trình viết mã)
Người dùng (ở đây là lập trình viên) hoàn toàn bị cô lập với các nhiệm vụ trên. và anh ta không thể thao tác trực tiếp  lên bộ nhớ, vì tất cả công việc đó được thực hiện bởi CLR
- Trong khi đó, mã không được quản lý Unmanaged code được thực thi bên ngoài sự kiểm soát của CLR.
Ví dụ đẽ thấy là các thư viên Win32 DLLs của chúng ta như kernel32.dll, user32.dll, và các thành phần COM được cài đặt trên hệ thống. Giống như trong một chương trình C++ chương trình cấp phát bộ nhớ cho một con trỏ là một ví dụ của mã không được quản lý bởi vì chính lập trình viên phải có trách nhiệm:
  • Gọi hàm cấp phát bộ nhớ
  • Đảm bảo đúng khuôn mẫu
  • Đảm bảo bộ nhớ được giải phóng mỗi khi xong nhiệm vụ

Read More

Thứ Bảy, 7 tháng 8, 2010

// // Leave a Comment

Sự Khác Nhau Giữa Delegate Và Event

Chúng ta có thể làm những điều tương tự với cả hai cách sử dụng delegate và event, và dường như chúng chỉ khác nhau về cú pháp khai báo?
Bạn và tôi sẽ cùng nhau phân biệt delegate và event thông qua các ví dụ dưới đây, xem sự rõ ràng của chúng trong cách sử dụng.
Dưới đây là cú pháp khai báo:

Delegate:
public class VubkaDelegate
{
public delegate void ExampleDelegate(); public ExampleDelegate DeleageteCallback;
}
Event:
public class VubkaEvent
{
public delegate void ExampleEvent(); public event ExampleEvent EventCallback;
}

Như vậy ta mới thấy được sự khác nhau của chúng cơ bản thông qua từ khóa event
Read More

Thứ Tư, 4 tháng 8, 2010

// // Leave a Comment

Delegate là gì?

Bạn biết gì về delegate?
Bạn lập trình cũng được một thời gian dài, đặc biệt là C#. Khi sử dụng delegate bạn có bao giờ để ý đến cách khởi tạo nó không và các toán tử đi kèm có ý nghĩa như thế nào?
Cho đến hôm nay mình mới hiểu ra được các cách khởi gán delegate và ý nghĩa của nó. Việc hiểu rõ và nắm chắc delegate là điều hết sức quan trọng và nó được sử dụng hầu hết trong các ứng dụng tính toán nhiều và xử lý các sự kiện độc lập
Với delegate thì cú pháp khai báo của nó như sau:
delegate result-type identifier ([parameters]);
Ví dụ: public delegate void SimpleDelegate (params object obj)
Nghĩa là ta đi khai báo một delegate trỏ tới một phương thức có giá trị trả về là kiểu void, tham số là danh sách các params đối tượng object obj.
Multicasting:
Điều này thật thú vị khi làm việc với delegate đó là Multicasting, nghĩa là nó có thể trỏ đến nhiều hàm cùng 1 lúc (System.MulticastDelegate). Multicase delegate lưu trữ danh sách tất cả các hàm mà nó sẽ được gọi khi thực thi delegate.
Cũng giống như class, delegate có cách khai báo tương tự bằng việc sử dụng toán tử new. Ngoài ra ta có thể gán trực tiếp thông qua các phép gán thông thường =, +=, -=.
Ví dụ: Giả sử ta đang có một hàm kiểu void tên là DoSomething() không đối số, và ta khai báo một delegate như sau
public delegate void SimpleDelegate();
Thì tương ứng ta có các cách khai báo một thể hiện của SimpleDelegate như sau:
SimpleDelegate _simpleDelegate;
_simpleDelegate = new SimpleDelegate(DoSomething);
_simpleDelegate += new SimpleDelegate(DoSomething);
_simpleDelegate -= new SimpleDelegate(DoSomething);
_simpleDelegate = DoSomething;
_simpleDelegate += DoSomething;
_simpleDelegate -= DoSomething;
_simpleDelegate += DoHomework;

Và tiếp đó ta chỉ việc gọi nó ra thông qua một sự kiện cụ thể nào đó,
bằng cách:
   _simpleDelegate();
hoặc:
   _simpleDelegate.Invoke();
Read More
// // 2 comments

Sự Khác Biệt Giữa Lớp Trừu Tượng Abstract Và Giao Diện Interface

    Đối với lập trình C# hay lập trình hướng đối tượng nói chung, vấn đề kế thừa sẽ đem lại nhiều phiền toái nếu bạn chưa nắm rõ về vấn đề này. Vậy thì sự khác biệt giữa lớp abstract và interface ở chỗ nào?

    Một lớp trừu tượng thì không có thể hiện nghĩa là ta không thể khởi tạo nó bằng toán tử new, và một phương thức trong nó là abstract thì chỉ được đưa ra định nghĩa (khai báo) mà không được thực thi và nó sẽ được overriden lại trong các lớp con kế thừa. Và trong lớp mà tồn tại phương thức abstract thì lớp đó cũng được định nghĩa abstract.

    Đối với giao diện thì khác hoàn toàn với lớp trừu tượng, nó định nghĩa một cách cứng nhắc các phương thức và thuộc tính trong chúng nghĩa là không cho phép ta thực thi bất kỳ một đoạn mã nào. Và tất cả các thành viên trong nó đều được định nghĩa công khai (public). Một cách tổng quan về giao diện: Giao diện là ràng buộc, giao ước đảm bảo cho các lớp hay các cấu trúc sẽ thực hiện một điều gì đó. Khi một lớp thực thi một giao diện, thì lớp này báo cho các thành phần client biết rằng lớp này có hỗ trợ các phương thức, thuộc tính, sự kiện và các chỉ mục khai báo trong giao diện.

    Một số lưu ý khi sử dụng abstract hay interface

Một class chỉ có thể kế thừa từ một abstract class, nhưng có thể kế thừa nhiều interface.
Trong Interface chỉ có thể khai báo các fields, methods, mà không được hiện thực nó. Còn đối với abstract thì dùng các biến, hiện thực cách methods.
Các fields, methods trong interace đều là public và bắt buộc các class kế thừa phải cài đặt nó (abstract). Trong abstract class thì có các fields, methods có thể là private, internal, public, protected và có thể là abstract hoặc non-abstract.
Interface dùng để gom các hành động cần được hiện thực , các khả năng của một đối tượng, còn abstract class cho các lớp thừa kế cùng 1 loại, tính chất hay trạng thái.
Abstract class có tốc độ thực thi nhanh hơn interface.
Thêm 1 tính năng mới vào interface sẽ phá vỡ toàn bộ các lớp hiện thực, còn abstract thì không.

    Ví dụ về interface, các thành viên của interface phải được thực thi trong các lớp mà kế thừa từ nó

    public interface IPlayer
    {
        string Name
        {
            get;
            set;
        }
        Player Actor
        {
            get;
            set;
        }
        
        Bitmap Image
        {
            get;
            set;
        }
    }

    Ví dụ dưới đây khai báo một lớp abstract có các thành viên trong nó là abstract và non-abstract, và được thực thi trong lớp con là Faculty

    abstract class Employee
    {
        protected string m_str_department;
        protected double m_db_salary;
        protected int m_i_dateHired;

        public string Department
        {
            get { return m_str_department; }
            set { m_str_department = value; }
        }

        public double Salary
        {
            get { return m_db_salary; }
            set { m_db_salary = value; }
        }

        public int DateHired
        {
            get { return m_i_dateHired; }
            set { m_i_dateHired = value; }
        }

        public override string ToString()
        {
            return "Employee: " + m_str_name
            + "\nEmail: " + m_str_email;
        }

        public abstract double CalculateBonus();
        public abstract int CalculateVacation();
    }

    class Faculty : Employee
    {
        string m_str_rank;
        double m_db_hours;

        public override double CalculateBonus()
        {
            return 1000 + 0.05 * m_db_salary;
        }

        public override int CalculateVacation()
        {
            if (m_i_dateHired > 3)
            {
                if (m_str_rank == "Senior Lecture")
                    return 6;
                return 5;
            }
            if (m_str_rank == "Senior Lecture")
                return 5;
            return 4; 
        }
    }

Read More