Аргыг нуух ба дахин тодорхойлолтын ялгаа

Програмчлалын c# хэл өргөн боломжтой, обьект хандлагат парадигмийг дэмждэг, том төслүүдийн боловсруулалтад өргөнөөр ашиглагддаг, маш универсал хэл. Хэлийг Microsoft хөгжүүлдэг нь л өөрөө ихийг хэлнэ. Миний бодлоор c# -ийн зарим шийдлүүдийг шууд ойлгоход хүндрэлтэй байдаг нь хэлний хийсвэрлэлттэй холбоотой байдаг болов уу. Хэлний боломжийг сайн судлан мэдэхгүйгээр сайн, хүчирхэг гэсэн утгаар төслийн үндсэн хэлээр ашиглах нь зөв биш шийдэл болов уу. Та c# хэл дээр код бичдэг, бичихээр суралцаж байгаа бол хэлний боломж, бололцоог сайн судлахыг зөвлөе.      

Виртуал аргууд, шинжүүд, Далд арга, шинжүүд хичээлүүдээр суурь классаас өвлөн авсан аргуудын ажиллагааг өөрчлөх нуух, дахин тодорхойлох гэсэн хоёр аргыг үзсэн. Эдгээр аргууд хоорондоо ямар ялгаатайг харцгаая.

Дахин тодорхойлох

class Person
{
    public string Name { get; set; }
    public Person(string name)
    {
        Name = name;
    }
    public virtual void Print()
    {
        Console.WriteLine(Name);
    }
}
class Employee : Person
{
    public string Company { get; set; }
    public Employee(string name, string company)
        : base(name)
    {
        Company = company;
    }
 
    public override void Print()
    {
        Console.WriteLine($"{Name} {Company} -д ажилладаг");
    }
}

Классуудийг програмд

Person tom = new Employee("Tom", "Microsoft");
tom.Print();        // Tom Microsoft -д ажилладаг

ашиглавал tom.Print() аргыг дуудахад tom хувьсагч Person төрлийнх хэдий ч Employee классийн Print аргын хэрэгжүүлэлт биелэгдэнэ. Компилятор виртуал аргуудтай ажиллахдаа виртуал аргуудын хүснэгтийг (Virtual Method Table эсхүл VMT) бүрдүүлдэг. Хүснэгтэд виртуал аргуудын хаягийг бичдэг. Класс бүрд өөрийн хүснэгтийг үүсгэдэг. Классийн обьект үүсэхэд компилятор обьектийн байгуулагчид VMT хүснэгт обьектийг холбох тусгай кодийг дамжуулдаг. Виртуал аргыг дуудахад обьектоос түүний VMT хүснэгтийн хаягийг аваад VMT хүснэгтээс аргын хаягийг олоод түүнд удирдлагыг шилжүүлдэг. Өөрөөр хэлбэл аргын хэрэгжүүлэлтийг сонгох үйлдэл програмийн ажиллагааны үед хийгддэг. Програмийг ажлуулах орчин эхлээд VMT хүснэгтээс хэрэгтэй аргын хаягийг авах шаардлагатай тул энэ нь програмийн ажиллагааг багахан удаашруулдаг гэдгийг тооцох хэрэгтэй.    

Нуулт

Одоо Person, Employee классуудад дахин тодорхойлолтын оронд нуултыг

class Person
{
    public string Name { get; set; }
    public Person(string name)
    {
        Name = name;
    }
 
    public void Print()
    {
        Console.WriteLine(Name);
    }
}
 
class Employee : Person
{
    public string Company { get; set; }
    public Employee(string name, string company)
            : base(name)
    {
        Company = company;
    }
    public new void Print()
    {
        Console.WriteLine($"{Name} {Company} -д ажилладаг");
    }
}

ашиглаад

Person tom = new Employee("Tom", "Microsoft");
tom.Print();        // Tom

дээрх байдлаар дуудвал юу болохыг харцгаая. Person төрлөөр илэрхийлэгдэх tom хувьсагч Employee обьектийн холбоосыг хадгална. Гэхдээ Print аргыг дуудахад Employee классийнх биш Person класст тодорхойлсон аргын хувилбар ажиллана. Яагаад гэвэл Employee класс суурь классаас өвлөн авсан Print аргыг ердөө дахин тодорхойлоогүй үнэндээ шинэ арга тодорхойлсон. Иймээс tom.Print() илэрхийллээр Person классийн Print арга дуудагдана.

Жич: Классийн арга шинжүүдийг дахин тодорхойлох, нуух ямар хэрэгтэй, хэзээ ашиглах юм гэж бодогдож магадгүй. Зарим нэгэн кодлогчид ч үүнийг ашиглаж үзээгүй байж болно. Үнэхээр төслийн архитектор, загвар зохиогчидийн даалгаварт удамшсан класст арга шинжүүдийг дахин тодорхойлох, нуух зүйл тусгагдаагүй бол кодлогч өөрөө дур мэдэн илүү хэрэгжүүлэлтийг хийж болохгүй. Та цаашдаа том төсөлд ажиллахаар болбол ийм зүйлийг ашиглах нь гарцаагүй.  

Мэдээлэл таалагдсан бол найзуудтайгаа хуваалцаарай.

  Нээгдсэн тоо: 478 Төлбөртэй

Литерал нь өөрчлөгдөхгүй утгыг илэрхийлнэ. (хааяа тэдгээрийг тогтмолууд гэж ч нэрлэдэг.) Литералуудыг хувьсагчид утгаар өгч болдог. Логик, бүхэл тоон, бодит тоон, тэмдэгт, мөрийн литералууд байж болно. null түлхүүр үг тусдаа литералийг илэрхийлнэ.

Логикийн литералууд

true (үнэн), false (худал) гэсэн хоёр логик тогтмол бий.

Console.WriteLine(true);
Console.WriteLine(false);

  Нээгдсэн тоо: 2209 Нийтийн

Өмнөх хичээлд бид өгөгдлийн сантай ажиллах Entity Framework технологи гэж юу болох, өгөгдлийн сантай ажиллахад шаардлагатай хэрэгслүүд, тэдгээрийг хэрхэн суулгахыг үзээд өгөгдлийн сан үүсгэн түүнд хандах жижигхэн програмыг зохиосон. Энэ хичээлээр өмнөх хичээлд бичсэн програмын код хэрхэн ажиллаж байгааг үргэлжлүүлэн судлах болно. Програмын кодыг сануулбал

using DbDemo.Properties;
using System;
using System.Data;
using System.Data.SqlClient;

namespace DbDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            using (IDbConnection connection = new SqlConnection(Settings.Default.DbConnect))
            {
                IDbCommand command = new SqlCommand("SELECT * FROM t_customers");
                command.Connection = connection;
                connection.Open();
                IDataReader reader = command.ExecuteReader();
                while (reader.Read())
                {
                    Console.WriteLine("Id: {0}\t Нэр: {1}", reader.GetInt32(0),
                        reader.GetString(1));
                }
            }
            Console.ReadLine();
        }
    }
}

гэж байгаа.

  Нээгдсэн тоо: 406 Нийтийн

Програм зохиох бол нарийн төвөгтэй ажил. Ямар ч програмын хувьд өөрийн хийх ажлаа гүйцэтгэхийн чацуу цаашдаа хөгжих, ажлын хүрээнд шинээр гарч ирэх илүү нарийн асуудлыг шийдвэрлэх боломжтой илүү уян хатан байдлаар зохиогдсон байх хэрэгтэй. Хэрвээ та програмын төслийн ахлагч, зохион бүтээгчээр ажиллаж байсан бол програмын ажиллагааг цаашдаа дэмжих, үйлчилгээ үзүүлэх, өргөжүүлэн хөгжүүлэхэд цаг хугацаа хожихын тулд кодыг нэг удаа хэрхэн яаж бичихийг тодорхойлох хамгийн төвөгтэй асуудал гэдгийг мэдэрсэн байх.

  Нээгдсэн тоо: 2438 Төлбөртэй

Манай энэ удаагийн сэдэв сонирхолтой болоод нилээд хүнд лямбда илэрхийлэл байх болно. Лямбда илэрхийлэлтэй танилцахын өмнө делегат гэж юу болох талаар делегат ба үйл явдал хичээлээс үзэхийг зөвлөе. Делегатын талаар ойлголтгүйгээр та лямбда илэрхийлэл гэж юу болохыг ойлгоход их хүндрэлтэй. Делегат ба үйл явдал хэрхэн ажилладагийг доорх кодоос харцгаая.

Үйл явдал /event/ тодорхой үйлдэл хийгдсэн талаар системд мэдэгддэг. Хэрвээ бид энэхүү үйлдлийг ажиглах хэрэгтэй бол яг энд…

Нээгдсэн тоо : 128

 

Манай төсөл олон хуудсуудтай болон тэдгээрийн хооронд динамикаар шилжилт хийж байгаа ч тухайн үед шилжилт хийгдсэн хуудаст тохирох…

Нээгдсэн тоо : 190

 

Зочин (Visitor) паттерн классуудыг өөрчлөхгүйгээр тэдгээрийн обьектуудын үйлдлийг тодорхойлох боломжийг олгоно. Зочин хэвийг ашиглахдаа классуудын хоёр ангилалыг тодорхойлно.…

Нээгдсэн тоо : 158

 

Лямбда-илэрхийлэл нь нэргүй аргын хураангуй бичилтийг илэрхийлнэ. Лямбда-илэрхийлэл утга буцаадаг, буцаасан утгыг өөр аргын…

Нээгдсэн тоо : 284

 

Кодийн сайжруулалт /рефакторинг/ хичээлээр програмийн кодоо react -ийн зарчимд нийцүүлэн компонентод салгасан.…

Нээгдсэн тоо : 313

 

Хадгалагч (Memento) хэв обьектын дотоод төлвийг түүний гадна гаргаж дараа нь хайрцаглалтын зарчмыг зөрчихгүйгээр обьектыг сэргээх боломжийг олгодог.

Нээгдсэн тоо : 320

 

Делегаттай нэргүй арга нягт холбоотой. Нэргүй аргуудыг делегатийн хувийг үүсгэхэд ашигладаг.
Нэргүй аргуудын тодорхойлолт delegate түлхүүр үгээр…

Нээгдсэн тоо : 385

 

Математикт харилцан урвуу тоонууд гэж бий. Ямар нэгэн тооны урвуу тоог олохдоо тухайн тоог сөрөг нэг зэрэг дэвшүүлээд…

Нээгдсэн тоо : 386

 

Төсөлд react-router-dom санг оруулан чиглүүлэгчдийг бүртгүүлэн тохируулсан Санг суулган тохируулах хичээлээр бид хуудас…

Нээгдсэн тоо : 461

 
Энэ долоо хоногт

Нээгдсэн тоо : 746

 

Аяга, стакан, ваар, лаазанд сүү, ундаа, квас, ус байжээ. Аяганд ус, сүү байхгүй, ундаатай сав ваар болон квастай савны дунд, лаазанд ундаа, усны аль нь ч байхгүй, стакан лааз ба сүүтэй савтай зэрэгцэн байрласан бол ямар саванд ямар шингэнийг хийсэн бэ.

Жич: Маш сонирхолтой гоё бодлого. Оролдоод үзээрэй.

Нээгдсэн тоо : 1074

 

илэрхийллийн хялбарчил.

Нээгдсэн тоо : 325