Life would be so much simple if we don't care so much

Archive for the ‘.NET’ Category

[C#] Một số điểm mới trong C# 3.0

Các ngôn ngữ lập trình của Microsoft đã trở nên phổ biến và được sử dụng rộng rãi do những tính chất mạnh mẽ, những kỹ thuật mới trong lập trình và cú pháp lệnh. Xu hướng hiện nay của các ngôn ngữ này là giảm bớt lượng mã lệnh, tận dụng cách viết mã dạng inline và những cú pháp lập trình mới, điều này giúp cho lập trình viên tiết kiệm được khá nhiều thời gian để viết và quản lý mã nguồn.

Bài viết này sẽ trình bày một số điểm mới liên quan đến cú pháp mã lệnh trong C# 3.0 tương ứng với phiên bản Visual Studio 2008.  Để thực hành các ví dụ sau, bạn cần cài đặt .Net frameword 3.0 trở lên, sử dụng Visual Studio 2008 hoặc Visual C# Express 2008 hay một trình soạn thảo văn bản (nên có hỗ trợ biên dịch C#).

1.    Tự động hiện thực các thuộc tính
(Auto implemented properties)

Một việc làm khá nhàm chán mà các lập trình viên hay phải làm sau khi tạo lớp là viết những accessor (còn gọi là setter, getter trong Java) hay có thể hiểu là các property của đối tượng. Trong C# cũng cung cấp sẵn chức năng tự động tạo ra các accessor từ các field (có thể hiểu là biến toàn cục trong lớp) có sẵn thông qua menu Refactor> Encapsulate Field…

Tuy nhiên có lẽ điều này vẫn chưa đủ, vì thế trong phiên bản 3.0 đã có một cải tiến mới giúp giảm bớt thời gian, thao tác bằng cách rút ngắn mã lệnh cần phải viết cho công đoạn này.

Ví dụ ta tạo một lớp SinhVien với một số thuộc tính tượng trưng theo phương pháp thông thường của C# như sau:

C# 2.0:

class Student

{

private int id;

public int ID

{

get { return id; }

set { id = value; }

}

private string name;

public string Name

{

get { return name; }

set { name = value; }

}

private DateTime birthDay;

public DateTime BirthDay

{

get { return birthDay; }

set { birthDay = value; }

}

}

Có thể thấy là chỉ với 3 field ta đã tốn khá nhiều dòng để tạo ra các property tương ứng cho lớp SinhVien này. Bây giờ ta thử tạo lớp SinhVien với cấu trúc tương tự trong C# 3.0:

C# 3.0:

class Student

{

public int ID { get; set; }

public string Name { get; set; }

public DateTime BirthDay { get; set; }

}

Một sự khác biệt đơn giản giữa hai đoạn mã của cùng một ngôn ngữ nhưng với hai phiên bản khác nhau giúp cho công việc viết mã trở nên dễ dàng hơn. Bạn có thể tiết kiệm được khá nhiều mã lệnh cần phải viết cho một lớp đồng thời giúp cho chúng dễ đọc hơn.

Trình biên dịch sẽ tự động tạo ra các biến private vô danh để lưu giữ giá trị của mỗi property này.

Trong trường hợp muốn thuộc tính chỉ cho phép đọc (read-only) bạn có thể thêm từ khóa private vào trước set ví dụ như với thuộc tính ID sau:

class Student
{
public int ID { get; private set; }

}

2.    Khởi tạo đối tượng
(Object initializers)

Thông thường khi tạo một lớp ta phải overload một số hàm khởi tạo để sử dụng theo từng trường hợp khác nhau. Mỗi overload xác định những tham số nào cần gán cho các thuộc tính của đối tượng, công đoạn cũng khá nhàm chán và có thể phải cần đến số lượng dòng lệnh khá lớn. Để giải quyết vấn đề này, C# 3.0 cung cấp cho ta một cách viết mới cho phép gán giá trị trực tiếp cho các field hoặc property cần thiết của đối tượng được tạo chỉ trong một dòng lệnh.

Ví dụ với lớp SinhVien ở trên, bạn không tạo ra một hàm khởi tạo cụ thể nào cả và sử dụng hàm khởi tạo mặc định để tạo ra một đối tượng SinhVien với các thông tin ban đầu.

C# 2.0:

SinhVien sv = new SinhVien();

sv.MaSo = 1;

sv.HoTen = “Ruby”;

sv.NgaySinh = new DateTime(1989, 10, 17);

Trong C# 3.0 bạn cần một dòng duy nhất để làm điều này:

C# 3.0:

Student sv = new Student{ ID = 1, Name = “Ruby”, BirthDay =new DateTime(1989, 10, 17); };

Để mã nguồn dễ đọc, bạn có thể định dạng lại như sau:

Student sv = new Student

{

ID = 1,

Name = “Ruby”,

BirthDay = new DateTime(1989, 10, 17)

};

3.    Khởi tạo tập hợp
(Collection initializers)

Đối với khởi tạo một tập hợp và thêm vào một số phần tử, bạn có thể khởi tạo nó như một mảng. Giả sử ta cần một tập hợp có định kiểu để lưu danh sách các SinhVien.

List<Student> list = new List<Student>();

Theo cách thông thường ta phải dùng phương thức Add() để thêm từng đối tượng kiểu SinhVien vào danh sách. Trong C# 3.0 ta có thể làm điều này ngay trong lúc khởi tạo tập hợp:

List<Student> list = new List<Student>{

new Student{ID=1,Name=”Ruby”},

new Student{ID=2,Name=”Doremon”},

new Student{ID=3,Name=”Nobita”}

};

4.    Biến cục bộ có kiểu ngầm định
(Implicitly typed local variables)

Trong C# 3.0 chúng ta có thể khai báo các biến cục bộ với kiểu không xác định thông qua từ khóa var. Khi được biên dịch, trình biên dịch sẽ tự động xác định kiểu của biến đó thông qua giá trị mà ta gán cho nó lúc khởi tạo.

Ví dụ:

var i = 100;

var s = “C# 3.0″;

Hai dòng lệnh trên tương đương với các dòng lệnh sau:

int i = 100;

string s = “C# 3.0″;

Bạn có thể gán cho biến khai báo bằng từ khóa var mọi giá trị mà bạn muốn, từ kiểu nguyên thủy, kiểu mảng cho đến những kiểu đối tượng phức tạp. Tuy nhiên cần lưu ý là, khi khai báo một biến với từ khóa var, bạn bắt buộc phải gán giá trị cho nó để trình biên dịch có thể xác định được biến đó thuộc kiểu gì. Bởi vì var không phải là một kiểu mà chỉ đơn giản là một từ khóa dùng để khai báo biến. Nếu cố làm điều này, bạn sẽ nhận được lỗi biên dịch “Implicitly-typed local variables must be initialized”. Cũng thế, việc gán null cho một biến được khai báo với var là không hợp lệ.

Vậy thì từ khóa var này có lợi ích gì? Chắc hẳn bạn sẽ tự tìm được câu trả lời sau một quá trình làm việc với nó. Trường hợp đơn giản như khi bạn khai báo một tập hợp có kiểu là List<int> và sau đó dùng foreach để duyệt qua nó, sau đó bạn lại thay đổi kiểu của tập hợp này sang List<double>. Khi đó nếu dùng var bạn không cần phải sửa kiểu biến trong cú pháp lặp nữa. Hơn nữa, mặc dù được khai báo với từ khóa var, bạn vẫn đảm bảo mã lệnh của mình được tối ưu vì không phải qua bước ép kiểu hoặc boxing nào, và vẫn sử dụng được chức năng IntelliSense của Visual Studio.

foreach (var sv in list)

{

Console.WriteLine(sv.Name+”\t”+sv.BirthDay.ToShortDateString());

}

Bạn có thể gặp một số trường hợp khác tương tự như vậy. Để thấy rõ hơn công dụng của từ khóa var, bạn hãy đọc tiếp phần sau.

5.    Kiểu dữ liệu nặc danh
(Anonymous types)

Dựa trên khái niệm “Tuple” (một bộ dữ liệu), C# 3.0 cho phép tạo ra một kiểu đối tượng tạm thời mà không cần định nghĩa trước và khai báo một lớp mới.

Cách sử dụng tương tự như việc tạo một đối tượng thông thường trong C# 3.0 ngoài việc không cần đến tên lớp. Ở đây ta sẽ thấy được vai trò không thể thiếu của từ khóa var được giới thiệu ở phần trên.

var school = new

{

ID = “HUI”,

Name = “ĐH CN”,

Address = “Tp.HCM”

};

Sau khi tạo ra đối tượng school này, ta có thể sử dụng nó tương tự như với các đối tượng thông thường với 3 property vừa được định nghĩa trong quá trình khởi tạo là ID, Name và Address.

Console.WriteLine(“Address: ” + school.Address);

Console.WriteLine(“Type Name: “+ school.GetType().Name);

Kết quả xuất ra như sau:

Address: Tp.HCM

Type Name: <>f__AnonymousType0`3

Có thể thấy là trình biên dịch tự động tạo ra một class mới với tên theo quy định của nó. Trong trường hợp bạn tạo ra 2 đối tượng kiểu nặc danh với các thuộc tính giống hệt nhau, trình biên dịch cũng vẫn chỉ tạo ra duy nhất một class mới. Xem ví dụ sau để hiểu thêm điều này:

var school1 = new

{

ID = “HUI”,

Name = “ĐH CN”,

Address = “Tp.HCM”

};

var school2 = new

{

ID = “HUI”,

Name = “ĐH CN”,

Address = “Tp.HCM”

};

Console.WriteLine(“Type Name: “+ school1.GetType().Name);

Console.WriteLine(“Type Name: ” + school2.GetType().Name);

Kết quả:

Type Name: <>f__AnonymousType0`3

Type Name: <>f__AnonymousType0`3

6.    Kết luận

Những phần được trình bày trên không phải là tất cả những điểm mới về cú pháp trong C# 3.0. Còn những kĩ thuật như Extension Method, Lambd Expression, Expression Tree, Partial Method,… sẽ được giới thiệu trong mỗi bài viết riêng để truyền tải được phần nào công dụng và cách thức sử dụng chúng. Tuy nhiên với những chức năng mới trên trong C# 3.0, chắc hẳn bạn cũng có thể nhận thấy chúng tiện lợi và hiệu quả cho công việc lập trình thế nào.

(…Nguồn: From Internet)

Advertisements

Enable silverlight debug in firefox – Visual Studio

Đối với các Silverlight developer, khi bật project và bắt đầu code, code đã đời và gặp bug (công việc hàng ngày mà), việc làm tiếp theo là check point để debug chương trình trên Visual Studio. Và kết quả là browser chạy lên đợi mãi nó vẫn không chạy vào breakpoint mà bạn đánh dấu. Bạn tiếp tục check breakpoint nhưng vẫn gặp kết quả tương tự. Đối với 1 programmer việc không thể debug chương trình sẽ làm chậm tiến độ code xuống rất nhiều, vì chỉ 1 lỗi nhỏ bạn phải mò mẫm cả buổi.

Thử với Internet Explorer thì vẫn bình thường?!?

Mình cũng đã gặp phải vấn đề này khi làm việc với Silverlight 4 trên VS 2010, ngồi check lỗi cả buổi trời chẳng hiểu tại sao.

Nếu gặp phải tình huống tương tự thì các bạn làm như sau nhé:

  • Trên thanh địa chỉ Firefox các bạn gõ vào: about:config
  • Chọn Accept và promise
  • Trên thanh tìm kiếm các bạn gõ: npctrl
  • Bạn sẽ thấy dòng sau dom.ipc.plugins.enabled.npctrl.dll
  • Thay đổi giá trị từ true sang false (Chỉ việc double click thoy ha)
  • Cuối cùng là :restart Firefox

Sau đó bật chương trình, check breakpoint vào đoạn chương trình cần debug. Mọi thứ trở lại bình thường.

Thủ thuật này mình tìm được từ blog của 1 developer Silverlight :

http://timheuer.com/blog/archive/2010/08/16/enable-silverlight-debugging-in-firefox-visual-studio.aspx

Cách chuyển Project của Visual Studio 2010 thành 2008

While testing the Visual Studio 2010 CTP went ahead and created a project, forgetting that the target version was in reality Visual Studio 2008. That said, since it was working just as it was required; found myself with the need to find a way to convert it backwards with as little re-work as possible.

Keep in mind that the Visual Studio 2010 CTP is still not the final release and things might change down the road, but for the moment the steps that worked for me are listed below.

  1. Open the .sln file corresponding to the Project to be converted with Notepad
  2. Locate the following line: Microsoft Visual Studio Solution File, Format Version 11.00
  3. Replace 11.00 with 10.00
  4. Locate the following line: # Visual Studio 2010
  5. Replace 2010 with 2008
  6. Save the File
  7. Delete the .cache files existing in the following paths: obj/debug, obj/release
  8. Open the project with Visual Studio 2008
  9. Build the project with Visual Studio 2008

=>> Tiếng Việt:

Khi dùng Visual Studio 2010 để tạo project, một điều cần lưu tâm đến là phiên bản của project hiện tại, có một số những câu hỏi đã đặt ra như nó có tương thích với Visual Studio 2008 hay không? Bây giờ nếu muốn project hiện tại chạy tốt trên Visual Studio 2008 thì làm sao?

Chính vì vậy, việc chuyển đổi trong lúc này là hết sức cần thiết vì một số những nguyên do nào đó mang tính bắt buộc. Bạn hãy thực hiện theo từng bước sau đây:

  1. Mở tập tin .sln bằng trình soạn thảo Notepad
  2. Tìm dòng: Microsoft Visual Studio Solution File, Format Version 11.00
  3. Thế 11.00 thành 10.00
  4. Tìm dòng: # Visual Studio 2010
  5. Thế 2010 thành 2008
  6. Lưu tập tin lại
  7. Xóa những tập tin có phần đuôi mở rộng là .cache, nó được chứa trong các thư mục : obj/debug, obj/release
  8. Mở project bằng Visual Studio 2008
  9. Nhấn Build (F5) để xây dựng lại project với Visual Studio 2008

Sưu tầm.

Drag và Drop (kéo thả) trong Silverlight 2

Drag và Drop (kéo thả) trong Silverlight 2

Có rất nhiều câu hỏi quanh vấn đề drag và drop trong silverlight. Mình có thảm khảo trên 1 số blog, web về silverlight của nước ngoài. Đây là ví dụ đơn giản để thực hiện drag và drop 1 item chứa trong 1 canvas:

Mình sử dụng Canvas (MainCanvas) và object cần drag n drop là 1 Rectangle (rect):

<Canvas x:Name=”MainCanvas” Width=”950″ Height=”550″>

<Rectangle x:Name=”rect” Fill=”Blue” HorizontalAlignment=”Left” VerticalAlignment=”Top” Width=”50″ Height=”50″>

</Rectangle>

</Canvas>


Bạn có thể tạo 1 object mà bạn cần drag nó bằng chuột: Ta sẽ sử dụng 3 events của mouse như sau:

  • MouseLeftButtonDown
  • MouseMove
  • MouseLeftButtonUp

void MainPage_Loaded(object sender, RoutedEventArgs e)

{

rect.MouseLeftButtonDown += new MouseButtonEventHandler(rect_MouseLeftButtonDown);

rect.MouseLeftButtonUp += new MouseButtonEventHandler(rect_MouseLeftButtonUp);

rect.MouseMove += new MouseEventHandler(rect_MouseMove);

}

Khởi tạo các biến cần thiết để kiểm tra dragging và lưu lại vị trí mouse:

public partial class MainPage : UserControl
{
        private bool _isRectMouseCapture = false;
        private Point clickPosition;
}

Biến _isRectMouseCapture chỉ là biến bool dùng để kiểm tra khi mouse capture tại object. Khi drag item, cần biết vị trí của object bắt đầu drag, đối tượng clickPosition chỉ nhằm tính toán khoảng cách giữa phần trên bên trái của object và vị trí chuột khi mouse đang nắm giữ object.

Trong sự kiện MouseLeftButtonDown, bạn cần capture mouse, lưu vị trí chuột:

void rect_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

{

// Flag kiem tra mouse capture tren rect

_isRectMouseCapture = true;

// Capture mouse

this.rect.CaptureMouse();

clickPosition = e.GetPosition(rect);

}


Khi mousedown vào object, bật biến _isRectMouseCapture thành true. Gọi phương thức CaptureMouse() để giữ chuột nằm trong vị trí giới hạn bởi object (rect). Sau đó, sử dụng phương thức GetPosition(..) của MouseButtonEventArgs  e để lấy tọa độ mouse liên kết với object (rect).

Trong sự kiện Mousemove, để move object, ta làm như sau

void rect_MouseMove(object sender, MouseEventArgs e)

{

if (_isRectMouseCapture)

{

// Lay vi tri moi cua mouse

Point newPosition = e.GetPosition(MainCanvas);

// Thiet lap value moi: Canvas.left va Canvas.top cho rect

rect.SetValue(Canvas.LeftProperty, newPosition.X – clickPosition.X);

rect.SetValue(Canvas.TopProperty, newPosition.Y – clickPosition.Y);

}

}

Nếu mouse capture tại object, lấy vị trị mới của mouse dùng phương thức GetPosition(…) của MouseEventArgs e, và tính toán thiết lập giá trị mới cho Canvas.LeftCanvas.Top của object rect đối với MainCanvas.

Trường hợp object không chứa trong 1 Canvas thì bạn có thể dùng TranslateTransform.

Trong sự kiện MouseLeftButtonUp, ta release mouse capture trên object và gán _isRectMouseCapture thành false:

void rect_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)

{

if (_isRectMouseCapture)

{

_isRectMouseCapture = false;

this.rect.ReleaseMouseCapture();

}

}

Tham khảo :http://www.85turns.com/2008/08/13/drag-and-drop-silverlight-example/

Tổng quan về Animation của Silverlight

…Một animation là tập hợp các frames, để chạy animation, các frames sẽ được show lần lượt nhau, giống như một đoạn video được stop + play. Animation chủ yếu dựa vào việc thay đổi các thuộc tính (dependency property) theo 1 giá trị thời gian. Chẳng hạn, làm button lớn dần, ta có thể thay đổi thuộc tính Width của nó trong animation.

1> Một số quy tắc của animation:

Animations thực thi dựa trên việc thay đổi các thuộc tính.

Mỗi kiểu dữ liệu yêu cầu 1 class animation khác nhau. Chẳng hạn, thuộc tính Width của button dùng kiểu double data, dùng class DoubleAnimation, muốn thay đổi màu sắc của 1 Canvas có thể dùng class ColorAnimation.

(Phiên bản silverlight hiện tại chỉ có thể modify các thuộc tính theo các kiểu dữ liệu : double, object, color và point.)

2> Phân loại:

Silverlight cung cấp 2 kiểu class animation:

Linear interpolation: giá trị các thuộc tính biến đổi mềm mại, liên tục trong suốt khoảng thời gian duration được thiết lập. Gồm có 3 class: DoubleAnimation (rất thường được sử dụng), PointAnimation, and ColorAnimation.

Key-frame animation: giá trị các thuộc tính biến đổi theo từng frame, (nhanh chậm phụ thuộc thời gian duration được thiết lập cho từng frame. Gồm 4 class: ColorAnimationUsingKeyFrames, DoubleAnimationUsingKeyFrames, PointAnimationUsingKeyFrames, và ObjectAnimationUsingKeyFrames.

Ví dụ: Giá trị góc sẽ thay đổi từ giá trị hiện hành tới 360  nhuần nhuyễn trong 5s

<DoubleAnimation Storyboard.TargetProperty=”Angle” To=”360″ Duration=”0:0:5″></DoubleAnimation>

3> Quản lý Timeline với Storyboard class:

Lớp storyboard được sử dụng để quản lý timeline dành cho animation của bạn. Storyboard xác định giá trị thuộc tính nào áp dụng cho element nào thông qua 2 thuộc tính: TargetProperty và TargetName properties.( Có thể nhóm các animation áp dụng cho cùng 1 đối tượng thay đổi các thuộc tính khác nhau, điều khiển để lặp, dừng, thay đổi vị trí …các animation.). Các giá trị From, To, Duration, By… nhằm thiết lập giá trị đầu và cuối của thuộc tính trong khoảng thời gian duration…, thuộc tính  RepeatBehavior (2x,3x/0:0:13/Forever) giúp bạn play lại các animation theo ý muốn.

Ví dụ:

<Storyboard x:Name=”storyboard”

Storyboard.TargetName=”cmdGrow” Storyboard.TargetProperty=”Width”>

<DoubleAnimation From=”160″ To=”300″ Duration=”0:0:5″></DoubleAnimation>

</Storyboard>

Bạn có thể tạo animation với event trigger hoặc sử dụng code behind:

Event trigger: Không cần fải viết code C#, animation bắt đầu khi trang được load.

Ví dụ:

<UserControl >

<UserControl.Triggers>

<EventTrigger>

<EventTrigger.Actions>

<BeginStoryboard>

<Storyboard>

<DoubleAnimation Storyboard.TargetName=”cmdGrow”

Storyboard.TargetProperty=”Width”

From=”160″ To=”300″ Duration=”0:0:5″></DoubleAnimation>

</Storyboard>

</BeginStoryboard>

</EventTrigger.Actions>

</EventTrigger>

</UserControl.Triggers>

<Grid x:Name=”LayoutRoot” Background=”White”>

<Button x:Name=”cmdGrow” Width=”160″ Height=”30″

Content=”This button grows”></Button>

</Grid>

</UserControl>

Code behind: Sử dụng code C# bắt sự kiện để khởi tạo các animation theo ý muốn.

Ví dụ: Định nghĩa storyboard tại resources…

<UserControl >

<UserControl.Resources>

<Storyboard x:Name=”storyboard”>

<DoubleAnimation Storyboard.TargetName=”cmdGrow” Storyboard.TargetProperty=”Width” From=”160″ To=”300 Duration=”0:0:5″></DoubleAnimation>

</Storyboard>

</UserControl.Resources>

<Grid x:Name=”LayoutRoot” Background=”White”>

<Button x:Name=”cmdGrow” Width=”160″ Height=”30″ Click=”cmdGrow_Click” Content=”This button grows”></Button>

</Grid>

</UserControl>

…Viết code behind khởi chạy animation khi click button:

private void cmdGrow_Click(object sender, RoutedEventArgs e)

{

storyboard.Begin();

}

Ngoài ra, sử dụng chức Easing (Easing in, Easing out…) sẽ giúp bạn tùy biến các animation linh hoạt và bắt mắt hơn.

Ví dụ:

<Storyboard x:Name=”growStoryboard”>

<DoubleAnimation Storyboard.TargetName=”cmdGrow” Storyboard.TargetProperty=”Width” To=”400″ Duration=”0:0:1.5″>

<DoubleAnimation.EasingFunction>

<ElasticEase EasingMode=”EaseOut” Oscillations=”10″></ElasticEase>

</DoubleAnimation.EasingFunction>

</DoubleAnimation>

</Storyboard>

Một khi bạn đã nắm được căn bản việc xây dựng các animation, liên kết các thuộc tính, điều khiển playback với storyboard…thì điều gặp phải khi tạo dựng animation chính là việc chọn lựa đúng thuộc tính để modify để đạt animation như mong muốn. Có 1 số điểm lưu ý như sau:

Nếu muốn tạo 1 animation làm đối tượng xuất hiện, biến mất => không nên dùng thuộc tính Visibility, thay vào đó có thể sử dụng Opacity.

Cần thay đổi vị trí của đối tượng => có thể sử dụng Canvas với thuộc tính Canvas.Left và Canvas.Top.

Download  Examples1

Download Examples2

—Ruby—

Cài đặt các thuật toán trên C++

Cài đặt các thuật toán sắp xếp trên C++

Đăng ngày: 21:02 09-12-2008

Bài viết này mình đã đăng cách đây cũg khá lâu trên PLus, mang sang đây cho phong phú 😀

(Download project tai đây Project Sort)
Đây là các bài tập C++, theo mình nghĩ 1 số bạn học C/C++ cũng rất quan tâm, bổ trợ cho việc thao tác cài đặt các hàm trên C++:
(Bạn nào thấy nên sửa lại chỗ nào thì để lại comment nha)

Cài đặt các thuật toán sắp xếp trên C++:

Bài làm tổ chức ct theo 2 tập tin: Ham chuc nang.h và Ham main.ccp
//Ham chuc nang.h

#include
#include
#include
#include
using namespace std;
#define MAX 10000

typedef int Array[MAX];
typedef char *String;

//Khai bao cac ham bo tro
void Nhap(Array a, int n);
void Xuat(Array a, int n);
void Gan(Array a,Array b,int n);
void Hoanvi(int &a, int &b);
int Min(int a, int b);
void Thucthi(String TenHam,Array a, int n,void (*HamSapXep)(Array, int));

//Khai bao nguyen mau cac ham sap xep
void Selection_sort(Array a, int n);
void Insertion_sort(Array a, int n);
void Interchange_sort(Array a, int n);
void Bubble_sort(Array a, int n);
void Shell_sort(Array a, int n);
void Taobuocnhay(int h[MAX],int n,int &k);
void Phanhoach(Array a,int left, int right);
void Quick_sort(Array a,int n);
void Shaker_sort(Array a, int n);
//Merge_sort
void Merge_sort(Array a, int n);
void Merge(Array a, int n,int k, int nb, int nc, Array b, Array c);
//Heap_sort
void Shift(Array a,int left, int right);
void CreateHeap(Array a, int n);
void Heap_sort(Array a, int n);
//Radix_sort
void Radix_sort(Array a, int n);
int FindMax(Array a, int n);
int CountDigits(int number);

//*___________________CAC HAM BO TRO__________________________

void Nhap(Array a, int n)
{
int i;
for(i=0;i<n;i++)
a[i]=rand()%100;
}

void Xuat(Array a, int n)
{
for(int i=0;i<n;i++)
cout< <<“\t”;
}

void Gan(Array a,Array b,int n)
{
for(int i=0;i<n;i++)
b[i]=a[i];
}

void Hoanvi(int &a, int &b)
{
int Tam;
Tam=a;
a=b;
b=Tam;
}

int Min(int a, int b)
{
int Min;
Min=a;
if(b<a)
Min=b;
return Min;
}

//Ham dung 1 con tro dong thoi tinh tg ham sx (dung con tro ham)
void Thucthi(String TenHam,Array a, int n,void (*HamSapXep)(Array, int))
{
time_t start, stop;
Array b;
cout<<“\nDang thuc thi ham sap xep chon…:”;
cout<<“\n”;
Gan(a,b,n);//Gan mang a cho b
start=time(NULL);//Thoi gian bat dau sx
(*HamSapXep)(b,n);//Goi ham sx cua con tro ham
stop=time(NULL);//Thoi gian ket thuc sx
cout<<“\nKet qua ham sap xep:”<
cout<<“\n”;
Xuat(b,n);
cout<<“\n”;
cout<<“\nThoi gian bat dau thuc hien: “<
cout<<“\nThoi gian ket thuc thuc hien: “<
cout<<“\nThoi gian thuc hien cua ham: “< <<“\n”;
}

//_________________CAC HAM SAP XEP____________________________

//1> Phuong phap chon truc tiep_________
void Selection_sort(Array a,int n)
{
int i,j,Csmin;
for(i=0;i<n-1;i++)
{
Csmin=i;
for(j=i+1;j++)
{
if(a[j]<a[Csmin])
Csmin=j;
}
Hoanvi(a[Csmin],a[i]);
}
}

//2> Phuong phap chen truc tiep_________
void Insertion_sort(Array a, int n)
{
int i,x,pos;
for(i=1;i<n;i++)
{
x=a[i];//Luu gia tri a[i] lai tren x
pos=i-1;
while(pos>=0&&a[pos]>x)
{
a[pos+1]=a[pos];//doi cho cac phan tu se dung sau x
pos–;
}
a[pos+1]=x;//chen x vao day
}
}

//3> Phuong phap doi cho truc tiep______
void Interchange_sort(Array a, int n)
{
int i,j;
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(a[j]<a[i])
Hoanvi(a[i],a[j]);
}

//4> Phuong phap bubble sort_____________
void Bubble_sort(Array a, int n)
{
int i,j;
for(i=0;i<n-1;i++)
for(j=n-1;j>1;j–)
if(a[j]<a[i])
Hoanvi(a[i],a[j]);
}
//5> Phuong phap heap sort________________
void Shift(Array a,int left, int right)
{
int p;
p=2*left;
if(p>right)
return;
if(p<right)
{
if(a[p]<a[p+1])
p=p+1;
}
if(a[left]<a[p])
{
Hoanvi(a[left],a[p]);
Shift(a,p,right);
}
return;
}
void CreateHeap(Array a, int n)
{
int i;
int left;
left=(n-1)/2;
int j=(n+1)/2-1;
for(i=j;0<=i;i–)
Shift(a,i,n-1);
}
void Heap_sort(Array a, int n)
{
int right=n-1;
CreateHeap(a,n);
for(int i=n-1;0
{
Hoanvi(a[0],a[i]);
Shift(a,0,i-1);
}
}

//6> Phuong phap shell sort_____________
void

Shell_sort(Array a, int n) {
Array h;
int k = (log(double (n)))/(log(2.0)) – 1;
h[k] = 1;

for(int i = k-1; i >= 0; i–)
h[i] = h[i+1] * 2 + 1;

for(int step = 0; step <= k; step++)
{
int len = h[step];
for(int i = len; i < n; i++)
{
int j = i – len;
int x = a[i];
while(a[j] > x && j >= 0)
{
a[j+len] = a[j];

j = j – len;
}
a[j+len] = x;
}
}
}

//7> Phuong phap Quick_sort_____________
void Phanhoach(Array a,int left, int right)
{
int i,j,x;
x=a[(left+right)/2];
i=left;
j=right;
do
{
while(a[i]<x)
i++;
while(a[j]>x)
j–;
if(i<=j)
{
Hoanvi(a[i],a[j]);
i++;
j–;
}
}
while(i<j);
if(left<j)
Phanhoach(a,left,j);
if(i<right)
Phanhoach(a,i,right);
}
void Quick_sort(Array a,int n)
{
Phanhoach(a,0,n-1);
}

//8> Phuong phap Shaker_sort____________
void Shaker_sort(Array a, int n)
{
int i, j, left, right, k;
left=0;
right=n-1;
k=n-1;
while(left<right)
{
for(i=right;i>left;i–)
{
if(a[i]<a[i-1])
{
Hoanvi(a[i],a[i-1]);
k=i;
}
}
left=k;
for(j=left;j<right;j++)
{
if(a[j]>a[j+1])
{
Hoanvi(a[j],a[j+1]);
k=j;
}
}
right=k;
}
}

//9> Phuong phap Merge sort___________
void Merge_sort(Array a, int n)
{
Array b,c;
int p,pb,pc;//Cac chi so tren mang a,b,c
int i;
int k=1;
do//Do dai cua day con khi phan hoach
{
p=pb=pc=0;
while(p<n)//Gan gia tri cua a xen ke k so  vao b va c
{
for(i=0;(p<n)&&(i<k);i++)
b[pb++]=a[p++];
for(i=0;(p<n)&&(i<k);i++)
c[pc++]=a[p++];
}
Merge(a,n,k,pb,pc,b,c);
k*=2;
}
while(k<n);

}
void Merge(Array a, int n,int k, int nb, int nc, Array b, Array c)
{
int p,pb,pc,ib,ic,kb,kc;
p=pb=pc=0;
ib=ic=0;
while((0<nb)&&(0<nc))
{
kb=Min(k,nb);
kc=Min(k,nc);
if(b[pb+ib]<=c[pc+ic])//So sanh 2 so dau day cua b, c
{
a[p++]=b[pb+ib];//Gan gia tri cua b vao a
ib++;//tang len toi khi bang kb
if(ib==kb)//Xem ke (k so) gan gia tri cua c vao a
{
for(;ic<kc;ic++)
a[p++]=c[pc+ic];
pb+=kb;
pc+=kc;
ib=ic=0;
nb-=kb;
nc-=kc;
}
}
else
{
a[p++]=c[pc+ic];//Gan gia tri cua c vao a
ic++;
if(ic==kc)
{
for(;;ib<kb;ib++)
a[p++]=b[pb+ib];
pb+=kb;
pc+=kc;
ib=ic=0;
nb-=kb;
nc-=kc;
}
}
}
}
//10> Phuong phap Radix sort___________
void Radix_sort(Array a, int n)
{
int max = a[FindMax(a, n)];
int k = CountDigits(max);
int b = 1, tam, dem;

int Lo[10][MAX];
int count[10];

for (dem = 0; dem<10; dem++)
count[dem] = 0;

for (int step = 0; step <= k; step++)
{
for (int i=0; i<n; i++)
{
tam = (a[i] / b) % 10;
Lo[tam][count[tam]] = a[i];
count[tam]++;
}

int i = 0;

for (dem = 0; dem < 10; dem++)
if (count[dem] > 0)
{
for (int c = 0; c < count[dem]; c++)
{
a[i] = Lo[dem][c];
Lo[dem][c] = 0;
i++;
}
count[dem] = 0;
}
b *= 10;
}
}
int FindMax(Array a, int n)
{
int Cs_max = 0;

for (int i=1; i<n; i++)
if (a[Cs_max] < a[i])
Cs_max = i;

return Cs_max;
}
int CountDigits(int number)
{
int count = 0;
while (number > 0)
{
number = number / 10;
count ++;
}
return count;
}

Ham main.ccp

#include
#include
//Cac ham menu
void Menu();
int Chon_Menu();
void Xuly_Menu(Array a, int n, int chon);

void main()
{
int n,chon;
Array a;
cout<<“Nhap so phan tu cua mang: “;
cin>>n;
Nhap(a,n);
Xuat(a,n);
Menu();
do
{
chon = Chon_Menu();
Xuly_Menu(a,n,chon);
}
while(1);
}

void Menu()
{
cout<<“\n_______________BANG MENU________________”;
cout<<“\n__1> Phuong phap chon truc tiep_________”;
cout<<“\n__2> Phuong phap chen truc tiep_________”;
cout<<“\n__3> Phuong phap doi cho truc tiep______”;
cout<<“\n__4> Phuong phap noi bot________________”;
cout<<“\n__5> Phuong phap Heap sort______________”;
cout<<“\n__6> Phuong phap Shell sort_____________”;
cout<<“\n__7> Phuong phap Quick sort_____________”;
cout<<“\n__8> Phuong phap Shaker sort____________”;
cout<<“\n__9> Phuong phap Merge sort_____________”;
cout<<“\n_10> Phuong phap Radix sort_____________”;
cout<<“\n_11> Thoat khoi chuong trinh____________”;
}
int Chon_Menu()
{
int Chon;
for(;;)
{
cout<<“\nNhap chon tu 1–>11: “;
cin>>Chon;
if(1<=Chon&&Chon<=11)
break;
}
return Chon;
}
void Xuly_Menu(Array a, int n, int chon)
{
int left=0;
int right=n-1;
switch(chon)
{
case 1:
cout<<“\n__1> Phuong phap chon truc tiep_________”;
cout<<“\n”;
Thucthi(“PP Chon truc tiep”,a,n,Selection_sort);
break;
case 2:
cout<<“\n__2> Phuong phap chen truc tiep_________”;
cout<<“\n”;
Thucthi(“PP Chon truc tiep”,a,n,Insertion_sort);
break;
case 3:
cout<<“\n__3> Phuong phap doi cho truc tiep______”;
cout<<“\n”;
Thucthi(“PP doi cho truc tiep”,a,n,Interchange_sort);
break;
case 4:
cout<<“\n__4> Phuong phap Bubble sort____________”;
cout<<“\n”;
Thucthi(“PP Bubble sort”,a,n,Bubble_sort);
break;
case 5:
cout<<“\n__5> Phuong phap Heap sort______________”;
cout<<“\n”;
Thucthi(“PP Heap sort”,a,n,Heap_sort);
break;
case 6:
cout<<“\n__6> Phuong phap Shell sort_____________”;
cout<<“\n”;
Thucthi(“PP shell sort”,a,n,Shell_sort);
break;
case 7:
cout<<“\n__7> Phuong phap Quick sort_____________”;
cout<<“\n”;
Thucthi(“PP quick sort”,a,n,Quick_sort);
break;
case 8:
cout<<“\n__8> Phuong phap Shaker sort____________”;
cout<<“\n”;
Thucthi(“PP shaker sort”,a,n,Shaker_sort);
break;
case 9:
cout<<“\n__9> Phuong phap Merge sort_____________”;
cout<<“\n”;
Thucthi(“PP merge sort”,a,n,Merge_sort);
break;
case 10:
cout<<“\n_10> Phuong phap Radix sort_____________”;
cout<<“\n”;
Thucthi(“PP radix sort”,a,n,Radix_sort);
break;
case 11:
cout<<“\n_11> Thoat khoi chuong trinh____________”;
exit(1);
}
}

Nếu blog ko hiển thị đủ code thì mọi ng` down project này về nha!

10 điều bạn nên biết về Silverlight

Một số người cho rằng Microsoft muốn phát hành sản phẩm này nhằm đánh bại đối thủ Flash của Adobe. Đến thời điểm này thì câu trả lời vẫn chưa ngã ngũ và có lẽ cần phải có thêm thời gian nữa để người dùng chấp nhận lựa chọn sản phẩm nào thú vị hơn.

Silverlight của Microsoft cũng có một số ưu điểm sẽ được liệt kê dưới đây:

1. Silverlight tránh được các vấn đề về hệ điều hành cũng như trình duyệt

Với hầu hết các nhóm phát triển phần mềm, việc phát triển một website làm việc trên các trình duyệt phổ biến khác nhau như Internet Explorer, Firefox, Safari và Opera quả là một điều khó khăn. Vấn đề ở đây không đơn giản ở việc cần thiết có sự bổ sung mã mà còn cả một số lượng lớn các công việc kiểm thử. Khi một nhà phát triển phần mềm tạo càng nhiều phiên bản trình duyệt và hệ điều hành, số lượng công việc test thử sẽ càng trở nên khổng lồ.

Thông thường có hai cách mà một dự án phát triển vẫn nhắm đến đó là: hỗ trợ một tập nhỏ các trình duyệt Web hoặc tăng số lượng nhân viên để đảm về chất lượng.

Tương phản với điều đó, Silverlight plug-in cho phép có được mô hình phát triển như nhau mà không cần quan tâm tới hệ điều hành và trình duyệt của người dùng là gì. Hiện nay, hai hệ điều hành và ba trình duyệt đã đang được hỗ trợ. Microsoft hứa sẽ bổ sung thêm sự hỗ trợ cho trình duyệt Opera trên hệ điều hành Windows và Mac. Thêm vào đó là dự án Mono tạo một bước tiến dài trong dự án Moonlight của nó, dự án này thiên về việc đưa Silverlight vào Linux.

2. Silverlight, câu chuyện có thật

Ngay từ phiên bản đầu là Release Candidate, Silverlight đã được nhiều tổ chức xem xét và cân nhắc. Quả thực nó có nhiều tính năng quan trọng và thú vị, nhận được rất nhiều sự đồng tình ủng hộ trong phát hành này.

Phát hành Silverlight 1.1 lần đầu tiên có hỗ trợ .Net, gồm có các ngôn ngữ .Net cơ bản, C# và Visual Basic. Thêm vào đó theo Microsoft, Silverlight 1.1 sẽ có sự hỗ trợ .Net cho các ngôn ngữ động như Ruby, Python, dynamic Visual Basic và Jscript đã có. Theo quan điểm của chúng tôi, các ngôn ngữ quan trọng để Silverlight hỗ trợ là C# và Visual Basic vì chúng cho phép các chuyên gia phát triển .Net có thể tạo các ứng dụng Silverlight. Trong phiên bản 1.1, bất kỳ ngôn ngữ .Net nào cũng phải được hỗ trợ, vì những gì thực sự được cung cấp cho trình duyệt đều là các thành phần .Net lắp ráp.

3. Silverlight sử dụng công nghệ quen thuộc với các chuyên gia phát triển

Silverlight được xây dựng với các công nghệ của Microsoft đang tồn tại: sự trộn lẫn giữa Windows Presentation Framework-như XAML (ngôn ngữ markup ứng dụng XML), JavaScript và các công nghệ .Net. Nếu các chuyên gia phát triển của bạn đã thân thiện với các công nghệ Web và Microsoft .Net thì họ hoàn toàn có thể sử dụng các kiến thức đã có để xây dựng ứng dụng Silverlight.

Phiên bản Silverlight bạn chọn để giới thiệu cho một dự án mới sẽ phụ thuộc vào các kỹ năng mà nhóm phát triển có. Nếu nhóm phát triển phần mềm nặng về phát triển ASP.NET trình chủ (chủ yếu là C# và VB.Net) thì bạn cần phải dùng Silverlight 1.1, còn nếu họ tinh thông về các ngôn ngữ trình khách như JavaScript, thì Silverlight 1.0 là nền tảng tuyệt vời để giới thiệu.

4. Giao diện người dùng của Silverlight cũng là Markup – giống HTML

XAML là một ngôn ngữ của Silverlight cho thiết kế giao diện người dùng. Bạn có thể đã quen với ngôn ngữ markup phổ biến khác như HTML. HTML là các văn bản thô gồm có các thông tin trình báo với trình duyệt Web về cách render “look” và “feel” của trang web. XAML cũng thực hiện các công việc tương tự. Tuy vậy thay vì trình duyệt thông dịch các chỉ lệnh về cách render file như thế nào thì runtime của Silverlight lại thực hiện việc render.

Tồn tại markup XAML là điều quan trọng vì nó có thể được tạo một cách tự động. Dù các chuyên gia phát triển của bạn sử dụng bất cứ công cụ nào để phát triển Web trình chủ thì cũng đều có thể tạo một HTML động cho các trang web. Kỹ thuật này quá hấp dẫn vì bạn có thể tạo các đoạn HTML có khả năng dùng lại để sử dụng trên chính site của bạn. Một ví dụ cho vấn đề này là thiết kế một trang chủ của các websie. Thông thường, phần header và footer (và cả phần bên phải và trái của trang) đều có thể được sử dụng lại trong toàn bộ trang web.

Vì XAML cũng là markup nên bạn có thể sử dụng các công nghệ trình khách để tạo động XAML giống như những gì mà các chuyên gia phát triển đã thực hiện với HTML. Ngôn ngữ markup tuy có phần khác nhưng các công nghệ lại hoàn toàn giống nhau.

5. Silverlight và công nghệ AJAX có thể bổ sung cho nhau

Web vẫn đang trong quá trình phát triển. Những ngày ban đầu khi mới xuất hiện web, thời điểm những năm 1990, bất kỳ ai cũng đều muốn rằng các chuyên gia phát triển nên chuyển nhiều thứ vào máy chủ để ứng dụng trở lên linh hoạt hơn. Trong khi vấn đề này đang được thực hiện tốt về mặt kỹ thuật thì nó đã cản trở những cảm nhận từ phía người dùng. Hiện giờ Asynchronous JavaScript and XML là tất cả những gì còn lại. Đơn giản AJAX viết mã một cách trực tiếp trong trình duyệt để cho phép sự tương tác với người dùng tốt hơn. Ví dụ kinh điển trong trường hợp này là Google maps (hoặc Live maps của Microsoft).

Silverlight đi theo mô hình này bằng cách cho phép nhiều giao diện người dùng ấn tượng hơn trong trình duyệt. Việc trao đổi dữ liệu giữa máy chủ và máy khách bằng sử dụng các công nghệ AJAX (dù thư viện AJAX nào đi chăng nữa) cho phép các ứng dụng Silverlight có nhiều sức mạnh. Sử dụng mô hình giao diện người dùng phong phú của Silverlight cùng với mô hình truyền tải dữ liệu mạnh của AJAX, bạn sẽ có được khả năng tương tác đến bất ngờ mà không cần ép buộc người dùng đợi cho đến khi trang web được refresh.

7. Silverlight cho phép các chuyên gia phát triển và các nhà thiết kế có thể làm việc cùng nhau

Web đã bắt buộc các nhóm phát triển phải nghĩ nhiều hơn về vấn đề thiết kế và mỹ học. Cảm nhận người dùng được thuận lợi và các giao diện có tính trực giác trở thành tiêu chuẩn đặc biệt. Điều này thường xảy ra bởi việc đòi hỏi phải đẹp và có các kỹ năng cho cảm nhận của người dùng trong phát triển ứng dụng. Ngày nay, điều đó được thực hiện bằng cách sử dụng các họa sỹ thiết kế để thiết kế cho một website.

Mặc dù vậy, các thành phần mà các nhà họa sỹ sử dụng và cung cấp thường khá khác nhau (tùy công cụ mà các chuyên gia phát triển sử dụng). Điển hình, các họa sỹ thiết kế cung cấp các file ảnh (như Photoshop hoặc các file .jpg) hoặc (trong một số trường hợp tiên tiến hơn) HTML đóng vai trò khung cho các chuyên gia phát triển phần mềm tích hợp chúng vào trong một dự án. Dù bạn sử dụng công nghệ nào đi chăng nữa thì các thiết kế đó cũng vẫn phải được tích hợp vào mã ứng dụng web. Khi việc thiết kế tiếp tục, sự tích hợp này được diễn ra một cách thường nhật. Về vấn đề này Silverlight đã đưa ra một diện mạo phát triển tốt hơn. Tập công cụ của Microsoft cho Silverlight là sự trộn lẫn của các công cụ phát triển truyền thống, như Visual Studio và các công cụ mới được đưa ra cho các nhà thiết kế như Expression Studio.

Với Silverlight, công cụ thiết kế chính là Expression Blend, công cụ này cho phép tạo XAML theo cách thích hợp và thân thiện với các nhà thiết kế. Sử dụng Blend cũng giống như Adobe Illustrator hoặc Photoshop. Sự khác biệt lớn nhất ở đây là nó sử dụng cùng công cụ mà các nhà phát triển sử dụng. Blend làm việc cùng với các file dự án, các file XAML và JavaScript cũng như Visual Studio. Khi một thiết kế được tạo và tinh chỉnh, không cần đến bước tích hợp để sử dụng nó trong Silverlight. Các nhà thiết kế có thể xem sự tương tác thiết kế của mình với cùng logic mà các chuyên gia phát triển đưa vào trong một dự án lớn. Cách thực hiện như vậy giúp các nhà thiết kế cũng như chuyên gia phát triển có thể làm việc cùng nhau tốt hơn.

7. Khả năng phân phối Silverlight

Silverlight được phân phối đến một trình duyệt web trong các mẩu chương trình nhỏ. Điều này có nghĩa là trong một hoặc nhiều gói (các file JavaScript, assemblies,…), thiết kế được cung cấp bằng một hoặc một vài gói (như các file XAML) và các tài nguyên khác được cung cấp một cách độc lập (ảnh, phông chữ và video). Các chuyên gia phát triển Silverlight thời gian đầu, những người đã quen thuộc với khả năng phân phối của một file Flash chưa thích vấn đề này.

Tuy vậy trong thực tế lại hoàn toàn khác. Các gói tách biệt lại khuyến khích sự sáng tạo trong nội dung động phía trình chủ dễ dàng hơn những gì đã được thực hiện trong Flash ngày nay. Nó cho phép chúng ta có thể tạo XAML hấp dẫn và động trên máy chủ, phân phối nó một cách đơn giản theo cách mà chúng ta thực hiện với markup (ví dụ như HTML). Silverlight có một điều kiện thuận lợi cho việc sử dụng các file Zip để đóng gói nhiều file được sử dụng bởi mã XAML (ảnh, video, phông chữ, các file kịch bản…) và download chúng hiệu quả đến máy khách.

8. Điểm mới trong Silverlight

Silverlight thực sự là những cố gắng của Microsoft trong công nghệ này. Quả thực đây là một công nghệ chưa thực sự chín muồi với những sản phẩm hiện đang được cung cấp của các công ty khác như Flash và Flex của Adobe. Flash hiện đang có phiên bản 9.0 và sản phẩm này đã có một lịch sử phát triển khá lâu, luôn dẫn đầu về cả tính phổ biến và sự phong phú. Tuy nhiên điều đó không có nghĩa rằng Silverlight sẽ không thể bắt kịp Flash trong cuộc chạy đua này. Microsoft có một sở trường riêng cho việc học từ những thất bại và thành công của người đi trước (hãy xem Java và .NET). Tuy nhiên mọi vấn đề đều chưa thể chắc chắn ngay từ bây giờ được.

Nếu bạn lên kế hoạch tạo các ứng dụng thay thế chính cho các ứng dụng máy trạm làm việc để kiểm soát dữ liệu thì có thể thiếu mất các điều khiển cơ bản và việc kết nối dữ liệu trong Silverlight. Silverlight không phải là một sự thay thế cho các biểu mẫu của Windows Forms, Windows Presentation Foundation (WPF), Java Applets hoặc Sharepoint. Đơn giản là nó được thiết kế để thực hiện nhiệm vụ của các ứng dụng dòng doanh nghiệp. Tuy nhiên nếu bạn muốn tạo các ứng dụng phong phú hoạt động được trên nhiều nền tảng và hệ điều hành thì Silverlight chính là thứ phù hợp.

9. Silverlight XAML với WPF XAML

XAML có thể nói như một ưu điểm tuyệt vời vì WPF của Microsoft cũng sử dụng XAML. Tuy nhiên không may ở đây là các ưu điểm này không hấp dẫn như những gì nó có vẫn được nghĩ vì sự chấp thuận WPF vẫn ở con số thấp và các điểm khác nhau giữa WPF XAML và Silverlight XAML.

Trước tiên những nhân chứng cho thấy rằng sự tỉ lệ chấp thuận WPF vẫn tương đối thấp trong so sánh với các công nghệ trình khách khác như Visual Basic 6 và Windows Forms của .Net. Chính vì vậy sự thật XAML vẫn chưa thực sự mạnh trong một vài năm vừa qua.

Thứ hai, Silverlight XAML là một văn phạm đã được đơn giản hóa so với WPF XAML, chính vì vậy Silverlight XAML không có nhiều sức mạnh. Điều này tốt và cũng không tốt. Silverlight XAML thực sự rất dễ hiểu nhưng nếu các chuyên gia phát triển vẫn so sánh với Silverlight từ WPF, thì nó dường như là không đủ.

Với quan điểm của chúng tôi, văn phạm nhỏ hơn sẽ tốt hơn cho Silverlight, vì runtime là nó và có khả năng quản lý người dùng. Silverlight XAML không có những thứ gì không cần thiết cho nhiệm vụ thủ công. Rõ ràng nó sẽ có lợi trong việc xây dựng nhiều chức năng trong Silverlight XAML, nhưng phương pháp hiện hành khá cẩn thận về lượng được bổ sung để giữ giao diện lập trình ứng dụng nhỏ và nhẹ.

10. Silverlight cách tuyệt vời để học XAML

Như được nhìn nhận từ phần trên, XAML của Silverlight có một văn phạm tương đối nhỏ. Điều này có nghĩa nó chính là cách tốt để học XAML làm việc như thế nào. Các chuyên gia phát triển phần mềm đang muốn học XAML và muốn theo kịp với tốc độ của công nghệ sẽ hiểu rõ giá trị của Silverlight với cách tạo mã sáng sủa và ngắn gọn của nó. Hầu hết các chuyên gia phát triển đều sẽ sớm nghĩ về các tính năng mà họ sẽ thích trong Silverlight. Khi bắt đầu xem xét XAML của WPF họ sẽ thấy được hầu hết các tính năng đó đều có trong Silverlight,

Ngược lại các chuyên gia bắt đầu với WPF và chọn Silverlight sẽ cần từ bỏ một số phương tiện dự trữ trong chuẩn bị của họ.

Lúc này chính là thời điểm để xác định xem sử dụng Silverlight trong chiến lược Web của bạn là đúng hay không. Silverlight là một công nghệ thú vị mà có lợi ích nhiều với công ty của bạn cũng như các khách hàng và người dùng. Chúng tôi hy vọng bài này có thể giúp được bạn có được tầm hiểu biết sâu hơn về các tài liệu thị trường và hiểu được những giá trị thực cũng như hạn chế của công nghệ.


(forum.aspvn.net)