Từ 1 tới 5 trên tổng số 5 kết quả

Đề tài: một vài thắc mắc cơ bản chưa hiểu khi học C#

  1. #1
    Ngày gia nhập
    02 2008
    Bài viết
    15

    Mặc định một vài thắc mắc cơ bản chưa hiểu khi học C#

    1.vd đoạn code
    Visual C# Code:
    1. static void Main(string[] args)
    2.         {
    3.             int i = 5; // dòng 1
    4.             for (int i = 0; i < 3; i++)
    5.             {
    6.                 Console.WriteLine("hahah hehe {0}", i);
    7.             }
    8.         //  Console.WriteLine("haha hehe {0}", i); dòng 8
    9.         }
    compiler sẽ báo lỗi bởi vì đã có biến i khai báo parent ngoài rồi.theo mình học trước đây nếu mình 0 nhầm như php javascript thì phải :thì biến i = 5 là biến ngoài còn biến local i = 0 declaration ở trong riêng chẳng liên quan gì đến nhau cả câu lệnh vẫn sẽ được thông dịch bình thường.còn nếu bỏ // ở dòng 8 đi và xóa dòng 1 sau đó thành:
    Visual C# Code:
    1. static void Main(string[] args)
    2.         {
    3.          //   int i = 5;
    4.             for (int i = 0; i < 3; i++)
    5.             {
    6.                 Console.WriteLine("hahah hehe {0}", i);
    7.             }
    8.           Console.WriteLine("haha hehe {0}", i);
    9.         }
    bộ biên dịch vẫn báo lỗi mình 0 hiểu cái biến i declaration nó là local hay là public nữa ở trong ngoặc {} thì là local rồi còn () ở đây lạ quá
    có vẻ như c# cấm khai báo tên biến trong giống biến ngoài mà điều này ở các ngôn ngữ khác được chấp nhận mà trong khoảng {} thì coi như chỉ có biến trong không có mặt của biến ngoài còn ở ngoài {} thì biến trong 0 có.
    2.sự khác nhau giữa chuyển đổi kiểu vd: (byte)variable (Đại ý là casting ra loại gì đó)và Convert.Toint32(variable) hay convert ra cái gì đấy mình 0 hiểu sao cái C# này lắm kiểu đổi type thế còn mấy kiểu parse nữa
    mới học còn gà nhờ các bạn chỉ giáo thanks
    Đã được chỉnh sửa lần cuối bởi hahakk : 01-04-2008 lúc 01:13 AM.

  2. #2
    Ngày gia nhập
    07 2007
    Nơi ở
    Sơn La
    Bài viết
    133

    Bạn có thể tham khảo tạm cái này nhé, rùi test sẽ hiểu.
    Phạm vi hoạt động của biến (Variable Scope).


    Phạm vi hoạt động của biến là vùng đoạn mã mà từ đấy biến có thể được truy xuất.

    Trong một phạm vi hoạt động (scope), không thể có hai biến cùng mang một tên trùng nhau.

    Thí dụ ta không thể làm như sau :

    Visual C# Code:
    1. int x = 20;
    2. // một số câu lệnh ở đây
    3. int x = 30;
    Xét ví dụ sau :
    Visual C# Code:
    1. using System;
    2. namespace Wrox.ProCSharp.Basics
    3. {
    4.    public class ScopeTest
    5.    {
    6.       public static int Main()
    7.       {
    8.          for (int i = 0; i < 10; i++)
    9.          {
    10.             Console.WriteLine(i);
    11.          }   // biến i ra khỏi phạm vi
    12.          // Chúng ta có thể khai báo thêm biến i ở đây
    13.          for (int i = 9; i >= 0; i--)
    14.          {
    15.             Console.WriteLine(i);
    16.          }   // biến i ra khỏi phạm vi ở đây
    17.          return 0;
    18.       }
    19.    }
    20. }

    Đoạn mã trên đơn giản in ra các số từ 0 đến 9, rồi lộn ngược lại từ 9 đến 0, sử dụng vòng lặp for.Chúng ta sẽ đề cập loại vòng lặp này. Điều quan trọng là ở đây chúng ta khai báo biến i hai lần trong cùng một hàm ScopeTest.Chúng ta có thể làm được điều này vì i được khai báo trong vòng lặp nghĩa là biến i cục bộ đối với vòng lặp.Một khi vòng lặp hoàn thành nhiệm vụ thì biến thoát khỏi phạm vi, và không thể truy xuất được nữa.

    Chúng ta xem tiếp một ví dụ khác :

    Visual C# Code:
    1.       {
    2.          int j = 20;
    3.          for (int i = 0; i < 10; i++)
    4.          {
    5.             int j = 30;   // không thể thực thi  - j vẫn còn trong phạm vi
    6.             Console.WriteLine(j + i);
    7.          }
    8.          return 0;
    9.       }

    Đoạn mã trên sẽ được biên dịch mặc dù có hai biến đặc tên j trong phạm vi không có phương thức hàm main( ) biến j được định nghĩa ở lớp mức và không đi ra ngoài đến khi lớp bị huỷ ( trong trường hợp này chương trình kết thúc khi hàm main( ) kết thúc), biến j được định nghĩa trong hàm main( ) phương thức ẩn trong lớp mức với biến cùng tên j nên khi chạy chương trình sẽ hiện giá trị 30.



    Ta xem đoạn thí dụ sau :

    Visual C# Code:
    1. using System;
    2.  
    3. namespace Wrox.ProCSharp.Basics
    4. {
    5.    class ScopeTest2
    6.    {
    7.       static int j = 20;
    8.  
    9.       public static void Main()
    10.       {
    11.          int j = 30;
    12.          Console.WriteLine(j);
    13.          return;
    14.       }
    15.    }
    16. }
    Chương trình vẫn hoạt động và cho kết quả là 30.
    Trao đổi kiến thức sẽ giúp ta tiếp cận nhanh với kiến thức.

  3. #3
    Ngày gia nhập
    02 2008
    Bài viết
    88

    Mình thấy NT_OnlyLove đã giải thích nhưng không có trường hợp nào giống với trường hợp mà hahakk đã hỏi
    Visual C# Code:
    1. static void Main(string[] args)
    2.         {
    3.             int i = 5; // dòng 1
    4.             for (int i = 0; i < 3; i++)
    5.             {
    6.                 Console.WriteLine("hahah hehe {0}", i);
    7.             }
    8.         //  Console.WriteLine("haha hehe {0}", i); dòng 8
    9.         }
    Ở đây mình thấy rõ rằng int i = 5; // dòng 1 là tầm vực thuộc về lớp.
    Trong khi đó for (int i = 0; i < 3; i++) thì i có tầm vực trong vòng for nhưng tại sao lại báo lỗi
    Mình từ Caulacbovb qua)
    Giã từ VB6 đến với VB.Net, C# và Java.

  4. #4
    Ngày gia nhập
    02 2008
    Bài viết
    15

    các vd đưa ra của only love

    Xét ví dụ sau :
    Visual C# Code:
    1. using System;
    2. namespace Wrox.ProCSharp.Basics
    3. {
    4.    public class ScopeTest
    5.    {
    6.       public static int Main()
    7.       {
    8.          for (int i = 0; i < 10; i++)
    9.          {
    10.             Console.WriteLine(i);
    11.          }   // biến i ra khỏi phạm vi
    12.          // Chúng ta có thể khai báo thêm biến i ở đây
    13.          for (int i = 9; i >= 0; i--)
    14.          {
    15.             Console.WriteLine(i);
    16.          }   // biến i ra khỏi phạm vi ở đây
    17.          return 0;
    18.       }
    19.    }
    20. }

    Đoạn mã trên đơn giản in ra các số từ 0 đến 9, rồi lộn ngược lại từ 9 đến 0, sử dụng vòng lặp for.Chúng ta sẽ đề cập loại vòng lặp này. Điều quan trọng là ở đây chúng ta khai báo biến i hai lần trong cùng một hàm ScopeTest.Chúng ta có thể làm được điều này vì i được khai báo trong vòng lặp nghĩa là biến i cục bộ đối với vòng lặp.Một khi vòng lặp hoàn thành nhiệm vụ thì biến thoát khỏi phạm vi, và không thể truy xuất được nữa.
    như vậy chứng mình là cách biến i khai báo ở vòng lặp for có giá trị local thế tại sao trong vd mình đưa lên mình để 1 cái public 1 cái local lại báo error. nếu những khai báo ở mỗi vòng lặp for không local thì (mỗi cái có 1 scope riêng)chắc chắn error vì nó là public và chương trình nhận ra đã có 1 biến i trước đó được khai báo rồi bạn không thể khai báo 1 biến i tên giống như vậy
    trước đây học qua C mình dùng thử một bộ compiler như C Free thì code viết như trên sẽ báo error (cái này mình 0 rõ lắm có thể các bộ compiler thì vấn đề này khác nhau ah`) thế là mình lại phải khai báo một biến trên cùng và bỏ các giá trị type trước variable name đi để nó thành khởi tạo thôi thì được hết error
    Chúng ta xem tiếp một ví dụ khác :

    Visual C# Code:
    1.       {
    2.          int j = 20;
    3.          for (int i = 0; i < 10; i++)
    4.          {
    5.             int j = 30;   // không thể thực thi  - j vẫn còn trong phạm vi
    6.             Console.WriteLine(j + i);
    7.          }
    8.          return 0;
    9.       }

    Đoạn mã trên sẽ được biên dịch mặc dù có hai biến đặc tên j trong phạm vi không có phương thức hàm main( ) biến j được định nghĩa ở lớp mức và không đi ra ngoài đến khi lớp bị huỷ ( trong trường hợp này chương trình kết thúc khi hàm main( ) kết thúc), biến j được định nghĩa trong hàm main( ) phương thức ẩn trong lớp mức với biến cùng tên j nên khi chạy chương trình sẽ hiện giá trị 30.
    Đã được chỉnh sửa lần cuối bởi hahakk : 01-04-2008 lúc 07:32 PM.

  5. #5
    Ngày gia nhập
    10 2007
    Bài viết
    37

    Mình thấy NT_OnlyLove giải thích đúng rồi mà:
    Visual C# Code:
    1. //Bạn khai báo biến i 2 lần => error
    2. int i = 5;
    3. for (int i = 0; i < 3; i++)
    4.  
    5. //Còn đoạn thứ 2
    6. for (int i = 0; i < 3; i++)
    7. {
    8.   Console.WriteLine("hahah hehe {0}", i);
    9. }
    10. Console.WriteLine("haha hehe {0}", i);
    11. - Complier kô hiểu i này khai báo ngoài hàm main hay i trong hàm main (trong for).
    12. - Tuy hết hàm for i kô còn giá trị nhưng nó đc khai báo trong hàm main nên có lỗi này.
    13. => tốt nhất bạn kô nên đặt biến trùng nhau.

    Còn câu thứ 2 có tất cả 4 cách convert
    1.Cast : cách này nhanh nhất (6 lần so với cách nhanh nhất trong 4 cách còn lại.
    Visual C# Code:
    1. //Trừ kiểu string kô thể cast ra các kiểu dữ liệu khác
    2. double d = 5.16d;
    3. int i = (int)d; // =5
    4. //=============
    5. private void comboBox_SelectedIndexChanged(object sender, EventArgs e)
    6. {
    7.       ComboBox cbo = (ComboBox)sender;
    8. }
    2.Convert.ToX: cách này nhanh nhì
    Visual C# Code:
    1. double d = 5.16;
    2. Convert.ToInt32(d);// = 5
    3.IConvertible.ToDouble: cách này nhanh 3
    Visual C# Code:
    1. double d = 5.16;
    2. int i = ((IConvertible)d).ToInt32(System.Threading.Thread.CurrentThread.CurrentCulture);   // = 5
    4.X.Parse: cách này lâu nhất vì nó còn phải chuyển kiểu thành string, Tất nhiên nếu đã là kiểu string có thể dùng kiểu này.
    int.Parse(
    Visual C# Code:
    1. double d = 5.16;
    2. int.Parse(d.toString()); // = 5

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn