[{"data":1,"prerenderedAt":2144},["ShallowReactive",2],{"navigation_docs":3,"-phong-van-ngan-hang-cau-hoi-csharp":420,"-phong-van-ngan-hang-cau-hoi-csharp-surround":2139},[4,153],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Phỏng vấn .NET","i-lucide-briefcase","\u002Fphong-van","1.phong-van",[10,27,66,111,128],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":26},"Tổng quan","i-lucide-compass","\u002Fphong-van\u002Ftong-quan","1.phong-van\u002F1.tong-quan",[16,21],{"title":17,"path":18,"stem":19,"icon":20},"Thị trường HCM","\u002Fphong-van\u002Ftong-quan\u002Fthi-truong","1.phong-van\u002F1.tong-quan\u002F1.thi-truong","i-lucide-trending-up",{"title":22,"path":23,"stem":24,"icon":25},"Lộ trình 7 ngày","\u002Fphong-van\u002Ftong-quan\u002Flo-trinh","1.phong-van\u002F1.tong-quan\u002F2.lo-trinh","i-lucide-calendar-days",false,{"title":22,"icon":25,"path":28,"stem":29,"children":30,"page":26},"\u002Fphong-van\u002Flo-trinh","1.phong-van\u002F2.lo-trinh",[31,36,41,46,51,56,61],{"title":32,"path":33,"stem":34,"icon":35},"Ngày 1 — C# cơ bản","\u002Fphong-van\u002Flo-trinh\u002Fngay-1-csharp-co-ban","1.phong-van\u002F2.lo-trinh\u002F1.ngay-1-csharp-co-ban","i-lucide-1",{"title":37,"path":38,"stem":39,"icon":40},"Ngày 2 — OOP và SOLID","\u002Fphong-van\u002Flo-trinh\u002Fngay-2-oop-solid","1.phong-van\u002F2.lo-trinh\u002F2.ngay-2-oop-solid","i-lucide-2",{"title":42,"path":43,"stem":44,"icon":45},"Ngày 3 — C# nâng cao","\u002Fphong-van\u002Flo-trinh\u002Fngay-3-csharp-nang-cao","1.phong-van\u002F2.lo-trinh\u002F3.ngay-3-csharp-nang-cao","i-lucide-3",{"title":47,"path":48,"stem":49,"icon":50},"Ngày 4 — Database và SQL","\u002Fphong-van\u002Flo-trinh\u002Fngay-4-database-sql","1.phong-van\u002F2.lo-trinh\u002F4.ngay-4-database-sql","i-lucide-4",{"title":52,"path":53,"stem":54,"icon":55},"Ngày 5 — ASP.NET Core và EF Core","\u002Fphong-van\u002Flo-trinh\u002Fngay-5-aspnet-efcore","1.phong-van\u002F2.lo-trinh\u002F5.ngay-5-aspnet-efcore","i-lucide-5",{"title":57,"path":58,"stem":59,"icon":60},"Ngày 6 — DSA coding","\u002Fphong-van\u002Flo-trinh\u002Fngay-6-dsa","1.phong-van\u002F2.lo-trinh\u002F6.ngay-6-dsa","i-lucide-6",{"title":62,"path":63,"stem":64,"icon":65},"Ngày 7 — Mock và HR","\u002Fphong-van\u002Flo-trinh\u002Fngay-7-mock-interview","1.phong-van\u002F2.lo-trinh\u002F7.ngay-7-mock-interview","i-lucide-7",{"title":67,"icon":68,"path":69,"stem":70,"children":71,"page":26},"Ngân hàng câu hỏi","i-lucide-database","\u002Fphong-van\u002Fngan-hang-cau-hoi","1.phong-van\u002F3.ngan-hang-cau-hoi",[72,77,82,87,92,97,102,107],{"title":73,"path":74,"stem":75,"icon":76},"C# (60+ câu)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fcsharp","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F1.csharp","i-lucide-hash",{"title":78,"path":79,"stem":80,"icon":81},"OOP và SOLID (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Foop","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F2.oop","i-lucide-shapes",{"title":83,"path":84,"stem":85,"icon":86},"SQL (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fsql","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F3.sql","i-lucide-database-zap",{"title":88,"path":89,"stem":90,"icon":91},"ASP.NET và EF (50+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-ef","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F4.aspnet-ef","i-lucide-server",{"title":93,"path":94,"stem":95,"icon":96},"DSA và Coding (30+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdsa-coding","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F5.dsa-coding","i-lucide-binary",{"title":98,"path":99,"stem":100,"icon":101},"HR và Soft skill (25+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fhr-behavior","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F6.hr-behavior","i-lucide-users",{"title":103,"path":104,"stem":105,"icon":106},"Design Pattern (55+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdesign-pattern","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F7.design-pattern","i-lucide-puzzle",{"title":108,"path":109,"stem":110,"icon":91},"ASP.NET MVC và Web API","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-mvc-webapi","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F8.aspnet-mvc-webapi",{"title":112,"itle":113,"icon":114,"path":115,"stem":116,"children":117,"page":26},"Tai Lieu","Tài liệu và Cheat sheet","i-lucide-book-marked","\u002Fphong-van\u002Ftai-lieu","1.phong-van\u002F4.tai-lieu",[118,123],{"title":119,"path":120,"stem":121,"icon":122},"Cheat Sheet","\u002Fphong-van\u002Ftai-lieu\u002Fcheatsheet","1.phong-van\u002F4.tai-lieu\u002F1.cheatsheet","i-lucide-clipboard-list",{"title":124,"path":125,"stem":126,"icon":127},"Nguồn tham khảo","\u002Fphong-van\u002Ftai-lieu\u002Fnguon","1.phong-van\u002F4.tai-lieu\u002F2.nguon","i-lucide-link",{"title":129,"icon":130,"path":131,"stem":132,"children":133,"page":26},"Phỏng vấn English","i-lucide-globe","\u002Fphong-van\u002Fenglish-interview","1.phong-van\u002F5.english-interview",[134,138,143,148],{"title":135,"path":136,"stem":137,"icon":130},"Tổng quan English","\u002Fphong-van\u002Fenglish-interview\u002Ftong-quan","1.phong-van\u002F5.english-interview\u002F1.tong-quan",{"title":139,"path":140,"stem":141,"icon":142},"Vocabulary","\u002Fphong-van\u002Fenglish-interview\u002Fvocabulary","1.phong-van\u002F5.english-interview\u002F2.vocabulary","i-lucide-book-a",{"title":144,"path":145,"stem":146,"icon":147},"Technical Q và A (EN)","\u002Fphong-van\u002Fenglish-interview\u002Ftechnical-en","1.phong-van\u002F5.english-interview\u002F3.technical-en","i-lucide-code",{"title":149,"path":150,"stem":151,"icon":152},"Behavioral (EN)","\u002Fphong-van\u002Fenglish-interview\u002Fbehavioral-en","1.phong-van\u002F5.english-interview\u002F4.behavioral-en","i-lucide-message-square-text",{"title":154,"icon":155,"path":156,"stem":157,"children":158},"Tự học","i-lucide-graduation-cap","\u002Ftu-hoc","2.tu-hoc",[159,161,287,310,333,357,384],{"title":154,"path":156,"stem":160,"icon":155},"2.tu-hoc\u002Findex",{"title":162,"icon":68,"path":163,"stem":164,"children":165},"Database","\u002Ftu-hoc\u002Fdatabase","2.tu-hoc\u002F1.database\u002Findex",[166,167,197,222,243,248],{"title":162,"path":163,"stem":164,"icon":68},{"title":168,"icon":91,"path":169,"stem":170,"children":171,"page":26},"SQL Server","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server","2.tu-hoc\u002F1.database\u002F2.sql-server",[172,177,182,187,192],{"title":173,"path":174,"stem":175,"icon":176},"1. Giới thiệu và Cài đặt","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F1.gioi-thieu-cai-dat","i-lucide-play-circle",{"title":178,"path":179,"stem":180,"icon":181},"2. Cú pháp cơ bản","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F2.cu-phap-co-ban","i-lucide-code-2",{"title":183,"path":184,"stem":185,"icon":186},"3. Truy vấn nâng cao","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F3.truy-van-nang-cao","i-lucide-git-merge",{"title":188,"path":189,"stem":190,"icon":191},"4. Đặc thù và Performance","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F4.dac-thu-performance","i-lucide-gauge",{"title":193,"path":194,"stem":195,"icon":196},"5. Q và A phỏng vấn","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F5.cau-hoi-phong-van","i-lucide-message-circle-question",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":26},"PostgreSQL","i-simple-icons-postgresql","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql","2.tu-hoc\u002F1.database\u002F3.postgresql",[203,206,209,212,215,218],{"title":173,"path":204,"stem":205,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":207,"stem":208,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F2.cu-phap-co-ban",{"title":183,"path":210,"stem":211,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F3.truy-van-nang-cao",{"title":188,"path":213,"stem":214,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F4.dac-thu-performance",{"title":193,"path":216,"stem":217,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F5.cau-hoi-phong-van",{"title":219,"path":220,"stem":221,"icon":96},"6. Tích hợp C# và Postgres","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftich-hop-csharp","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F6.tich-hop-csharp",{"title":223,"icon":224,"path":225,"stem":226,"children":227,"page":26},"MySQL","i-simple-icons-mysql","\u002Ftu-hoc\u002Fdatabase\u002Fmysql","2.tu-hoc\u002F1.database\u002F4.mysql",[228,231,234,237,240],{"title":173,"path":229,"stem":230,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F4.mysql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":232,"stem":233,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F4.mysql\u002F2.cu-phap-co-ban",{"title":183,"path":235,"stem":236,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F4.mysql\u002F3.truy-van-nang-cao",{"title":188,"path":238,"stem":239,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F4.mysql\u002F4.dac-thu-performance",{"title":193,"path":241,"stem":242,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F4.mysql\u002F5.cau-hoi-phong-van",{"title":244,"path":245,"stem":246,"icon":247},"So sánh 3 RDBMS","\u002Ftu-hoc\u002Fdatabase\u002Fso-sanh","2.tu-hoc\u002F1.database\u002F5.so-sanh","i-lucide-columns-3",{"title":249,"path":250,"stem":251,"children":252,"icon":254},"Supabase (BaaS)","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002Findex",[253,255,259,264,269,274,278,283],{"title":249,"path":250,"stem":251,"icon":254},"i-simple-icons-supabase",{"title":256,"path":257,"stem":258,"icon":68},"1. Database","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fdatabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002F1.database",{"title":260,"path":261,"stem":262,"icon":263},"2. Authentication","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fauthentication","2.tu-hoc\u002F1.database\u002F6.supabase\u002F2.authentication","i-lucide-key",{"title":265,"path":266,"stem":267,"icon":268},"3. Storage & Realtime","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fstorage-realtime","2.tu-hoc\u002F1.database\u002F6.supabase\u002F3.storage-realtime","i-lucide-zap",{"title":270,"path":271,"stem":272,"icon":273},"4. Edge Functions & AI","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Ffunctions-ai","2.tu-hoc\u002F1.database\u002F6.supabase\u002F4.functions-ai","i-lucide-brain",{"title":275,"path":276,"stem":277,"icon":181},"5. API & SDKs","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fapi-sdk","2.tu-hoc\u002F1.database\u002F6.supabase\u002F5.api-sdk",{"title":279,"path":280,"stem":281,"icon":282},"6. Platform & Deploy","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fplatform-deploy","2.tu-hoc\u002F1.database\u002F6.supabase\u002F6.platform-deploy","i-lucide-cloud",{"title":284,"path":285,"stem":286,"icon":196},"7. Interview & Q&A","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Finterview","2.tu-hoc\u002F1.database\u002F6.supabase\u002F7.interview",{"title":288,"icon":289,"path":290,"stem":291,"children":292},"TypeScript","i-simple-icons-typescript","\u002Ftu-hoc\u002Ftypescript","2.tu-hoc\u002F2.typescript\u002Findex",[293,294,297,301,306],{"title":288,"path":290,"stem":291,"icon":289},{"title":173,"path":295,"stem":296,"icon":176},"\u002Ftu-hoc\u002Ftypescript\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F2.typescript\u002F1.gioi-thieu-cai-dat",{"title":298,"path":299,"stem":300,"icon":81},"2. Type System","\u002Ftu-hoc\u002Ftypescript\u002Ftype-system","2.tu-hoc\u002F2.typescript\u002F2.type-system",{"title":302,"path":303,"stem":304,"icon":305},"3. Advanced types","\u002Ftu-hoc\u002Ftypescript\u002Fadvanced-types","2.tu-hoc\u002F2.typescript\u002F3.advanced-types","i-lucide-braces",{"title":307,"path":308,"stem":309,"icon":196},"4. Q và A phỏng vấn","\u002Ftu-hoc\u002Ftypescript\u002Fcau-hoi-phong-van","2.tu-hoc\u002F2.typescript\u002F4.cau-hoi-phong-van",{"title":311,"icon":81,"path":312,"stem":313,"children":314},"OOP","\u002Ftu-hoc\u002Foop","2.tu-hoc\u002F3.oop\u002Findex",[315,316,321,326,330],{"title":311,"path":312,"stem":313,"icon":81},{"title":317,"path":318,"stem":319,"icon":320},"1. Bốn tính chất","\u002Ftu-hoc\u002Foop\u002F4-tinh-chat","2.tu-hoc\u002F3.oop\u002F1.4-tinh-chat","i-lucide-circle-dot",{"title":322,"path":323,"stem":324,"icon":325},"2. SOLID","\u002Ftu-hoc\u002Foop\u002Fsolid","2.tu-hoc\u002F3.oop\u002F2.solid","i-lucide-shield",{"title":327,"path":328,"stem":329,"icon":106},"3. Design Pattern","\u002Ftu-hoc\u002Foop\u002Fdesign-pattern","2.tu-hoc\u002F3.oop\u002F3.design-pattern",{"title":307,"path":331,"stem":332,"icon":196},"\u002Ftu-hoc\u002Foop\u002Fcau-hoi-phong-van","2.tu-hoc\u002F3.oop\u002F4.cau-hoi-phong-van",{"title":334,"icon":305,"path":335,"stem":336,"children":337},"Generic","\u002Ftu-hoc\u002Fgeneric","2.tu-hoc\u002F4.generic\u002Findex",[338,339,344,349,354],{"title":334,"path":335,"stem":336,"icon":305},{"title":340,"path":341,"stem":342,"icon":343},"1. Khái niệm và cú pháp","\u002Ftu-hoc\u002Fgeneric\u002Fkhai-niem","2.tu-hoc\u002F4.generic\u002F1.khai-niem","i-lucide-book",{"title":345,"path":346,"stem":347,"icon":348},"2. Constraint và Variance","\u002Ftu-hoc\u002Fgeneric\u002Fconstraint-variance","2.tu-hoc\u002F4.generic\u002F2.constraint-variance","i-lucide-filter",{"title":350,"path":351,"stem":352,"icon":353},"3. C# vs TS","\u002Ftu-hoc\u002Fgeneric\u002Fso-sanh","2.tu-hoc\u002F4.generic\u002F3.so-sanh","i-lucide-git-compare",{"title":307,"path":355,"stem":356,"icon":196},"\u002Ftu-hoc\u002Fgeneric\u002Fcau-hoi-phong-van","2.tu-hoc\u002F4.generic\u002F4.cau-hoi-phong-van",{"title":358,"icon":359,"path":360,"stem":361,"children":362},"Nuxt 4","i-simple-icons-nuxt","\u002Ftu-hoc\u002Fnuxt-4","2.tu-hoc\u002F5.nuxt-4\u002Findex",[363,364,367,372,376,379],{"title":358,"path":360,"stem":361,"icon":359},{"title":173,"path":365,"stem":366,"icon":176},"\u002Ftu-hoc\u002Fnuxt-4\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F5.nuxt-4\u002F1.gioi-thieu-cai-dat",{"title":368,"path":369,"stem":370,"icon":371},"2. Routing và Rendering","\u002Ftu-hoc\u002Fnuxt-4\u002Frouting-rendering","2.tu-hoc\u002F5.nuxt-4\u002F2.routing-rendering","i-lucide-route",{"title":373,"path":374,"stem":375,"icon":91},"3. Data và Server","\u002Ftu-hoc\u002Fnuxt-4\u002Fdata-server","2.tu-hoc\u002F5.nuxt-4\u002F3.data-server",{"title":307,"path":377,"stem":378,"icon":196},"\u002Ftu-hoc\u002Fnuxt-4\u002Fcau-hoi-phong-van","2.tu-hoc\u002F5.nuxt-4\u002F4.cau-hoi-phong-van",{"title":380,"path":381,"stem":382,"icon":383},"5. Practical Todo App","\u002Ftu-hoc\u002Fnuxt-4\u002Fpractical-todo-app","2.tu-hoc\u002F5.nuxt-4\u002F5.practical-todo-app","i-lucide-check-square",{"title":385,"path":386,"stem":387,"children":388,"icon":390},"Tailwind CSS","\u002Ftu-hoc\u002Ftailwindcss","2.tu-hoc\u002F6.tailwindcss\u002Findex",[389,391,396,401,406,411,416],{"title":385,"path":386,"stem":387,"icon":390},"i-simple-icons-tailwindcss",{"title":392,"path":393,"stem":394,"icon":395},"1. Layout & Spacing","\u002Ftu-hoc\u002Ftailwindcss\u002Flayout-spacing","2.tu-hoc\u002F6.tailwindcss\u002F1.layout-spacing","i-lucide-layout",{"title":397,"path":398,"stem":399,"icon":400},"2. Typography & Colors","\u002Ftu-hoc\u002Ftailwindcss\u002Ftypography-colors","2.tu-hoc\u002F6.tailwindcss\u002F2.typography-colors","i-lucide-type",{"title":402,"path":403,"stem":404,"icon":405},"3. Interactive & Effects","\u002Ftu-hoc\u002Ftailwindcss\u002Finteractive-effects","2.tu-hoc\u002F6.tailwindcss\u002F3.interactive-effects","i-lucide-sparkles",{"title":407,"path":408,"stem":409,"icon":410},"4. Responsive & Dark Mode","\u002Ftu-hoc\u002Ftailwindcss\u002Fresponsive-darkmode","2.tu-hoc\u002F6.tailwindcss\u002F4.responsive-darkmode","i-lucide-monitor-smartphone",{"title":412,"path":413,"stem":414,"icon":415},"5. Customization & Theme","\u002Ftu-hoc\u002Ftailwindcss\u002Fcustomization","2.tu-hoc\u002F6.tailwindcss\u002F5.customization","i-lucide-settings-2",{"title":417,"path":418,"stem":419,"icon":181},"6. Practical Projects","\u002Ftu-hoc\u002Ftailwindcss\u002Fpractical-projects","2.tu-hoc\u002F6.tailwindcss\u002F6.practical-projects",{"id":421,"title":422,"body":423,"description":2132,"extension":2133,"links":2134,"meta":2135,"navigation":2136,"path":74,"seo":2137,"stem":75,"__hash__":2138},"docs\u002F1.phong-van\u002F3.ngan-hang-cau-hoi\u002F1.csharp.md","Ngân hàng câu hỏi C#",{"type":424,"value":425,"toc":2006},"minimark",[426,431,436,492,496,510,539,553,560,574,585,601,615,632,640,670,684,701,713,732,740,749,758,770,774,785,806,818,824,832,850,862,893,901,910,914,924,936,940,951,961,975,978,985,992,1005,1037,1040,1047,1050,1070,1074,1078,1096,1111,1133,1141,1155,1158,1162,1168,1193,1197,1201,1204,1217,1243,1247,1258,1262,1265,1290,1297,1310,1314,1318,1328,1338,1350,1363,1384,1392,1404,1410,1414,1427,1431,1439,1448,1452,1466,1473,1483,1494,1500,1508,1514,1522,1531,1538,1546,1552,1560,1563,1567,1571,1578,1584,1594,1604,1619,1623,1631,1635,1643,1654,1669,1673,1710,1714,1721,1741,1745,1760,1764,1784,1788,1801,1818,1822,1829,1840,1856,1864,1867,1882,1886,1910,1920,1934,1941,1949,1957,1964,1974,1981,1985,1993,1996,2002],[427,428,430],"h2",{"id":429},"a-kiểu-dữ-liệu-bộ-nhớ","A. Kiểu dữ liệu & bộ nhớ",[432,433,435],"h3",{"id":434},"_1-value-type-vs-reference-type-khác-nhau-ở-đâu","1. Value type vs Reference type khác nhau ở đâu?",[437,438,439,463,483,486],"ul",{},[440,441,442,443,447,448,447,451,447,454,457,458,462],"li",{},"Value type (",[444,445,446],"code",{},"int",", ",[444,449,450],{},"bool",[444,452,453],{},"struct",[444,455,456],{},"enum","): lưu trực tiếp giá trị, thường trên ",[459,460,461],"strong",{},"stack",".",[440,464,465,466,447,469,447,472,475,476,479,480,462],{},"Reference type (",[444,467,468],{},"class",[444,470,471],{},"string",[444,473,474],{},"array","): lưu ",[459,477,478],{},"địa chỉ"," đến object trên ",[459,481,482],{},"heap",[440,484,485],{},"Khi truyền vào method: value type copy giá trị, reference type copy địa chỉ.",[440,487,488,489,462],{},"Default: value type = 0\u002Ffalse; reference type = ",[444,490,491],{},"null",[432,493,495],{"id":494},"_2-boxing-và-unboxing-là-gì","2. Boxing và Unboxing là gì?",[497,498,499,502,503,506,509],"p",{},[459,500,501],{},"Boxing"," = convert value type → object (cấp phát heap).",[504,505],"br",{},[459,507,508],{},"Unboxing"," = convert ngược lại, cần cast.",[511,512,517],"pre",{"className":513,"code":514,"language":515,"meta":516,"style":516},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","int x = 5;\nobject o = x;      \u002F\u002F boxing\nint y = (int)o;    \u002F\u002F unboxing\n","csharp","",[444,518,519,527,533],{"__ignoreMap":516},[520,521,524],"span",{"class":522,"line":523},"line",1,[520,525,526],{},"int x = 5;\n",[520,528,530],{"class":522,"line":529},2,[520,531,532],{},"object o = x;      \u002F\u002F boxing\n",[520,534,536],{"class":522,"line":535},3,[520,537,538],{},"int y = (int)o;    \u002F\u002F unboxing\n",[497,540,541,542,544,545,548,549,552],{},"Tránh boxing bằng cách dùng ",[459,543,334],{}," (",[444,546,547],{},"List\u003Cint>"," thay ",[444,550,551],{},"ArrayList",").",[432,554,556,557,559],{"id":555},"_3-string-là-value-type-hay-reference-type","3. ",[444,558,471],{}," là value type hay reference type?",[497,561,562,565,566,569,570,573],{},[459,563,564],{},"Reference type"," nhưng immutable. So sánh ",[444,567,568],{},"=="," so sánh nội dung nhờ overload. Có ",[459,571,572],{},"string interning"," — string literal giống nhau dùng chung 1 object.",[432,575,577,578,580,581,584],{"id":576},"_4-string-immutable-nghĩa-là-gì-vì-sao-nên-dùng-stringbuilder","4. ",[444,579,471],{}," immutable nghĩa là gì? Vì sao nên dùng ",[444,582,583],{},"StringBuilder","?",[497,586,587,588,591,592,594,596,597,600],{},"Immutable = không sửa được sau khi tạo. Mọi thao tác như ",[444,589,590],{},"s + \"x\""," tạo string MỚI. Vòng lặp lớn → tạo nhiều rác.",[504,593],{},[444,595,583],{}," dùng mảng ",[444,598,599],{},"char[]"," mutable → append O(1) amortized, không cấp phát mới mỗi lần.",[432,602,604,605,608,609,608,612,584],{"id":603},"_5-const-vs-readonly-vs-static-readonly","5. ",[444,606,607],{},"const"," vs ",[444,610,611],{},"readonly",[444,613,614],{},"static readonly",[437,616,617,622,627],{},[440,618,619,621],{},[444,620,607],{},": compile-time, primitive only, inline vào nơi dùng. Đổi cần build lại.",[440,623,624,626],{},[444,625,611],{},": set trong ctor, mỗi instance khác nhau, mọi kiểu.",[440,628,629,631],{},[444,630,614],{},": 1 lần khi class load, share toàn app, mọi kiểu.",[432,633,635,636,639],{"id":634},"_6-nullable-type-int-thực-chất-là-gì","6. Nullable type — ",[444,637,638],{},"int?"," thực chất là gì?",[497,641,642,644,645,648,649,652,653,656,657,447,659,662,663,666,667,462],{},[444,643,638],{}," = ",[444,646,647],{},"Nullable\u003Cint>"," — struct chứa ",[444,650,651],{},"Value"," + ",[444,654,655],{},"HasValue",". Khi ",[444,658,491],{},[444,660,661],{},"HasValue = false",". Truy cập ",[444,664,665],{},".Value"," khi null → ",[444,668,669],{},"InvalidOperationException",[432,671,673,674,447,677,447,680,683],{"id":672},"_7-var-dynamic-object-khác-nhau-gì","7. ",[444,675,676],{},"var",[444,678,679],{},"dynamic",[444,681,682],{},"object"," khác nhau gì?",[437,685,686,691,696],{},[440,687,688,690],{},[444,689,676],{},": compile-time, compiler suy luận từ vế phải. Vẫn type-safe.",[440,692,693,695],{},[444,694,679],{},": runtime, bỏ qua type check, dễ runtime error.",[440,697,698,700],{},[444,699,682],{},": tĩnh là base type, dùng phải cast.",[432,702,704,705,447,707,447,710,584],{"id":703},"_8-so-sánh-equals-referenceequals","8. So sánh ",[444,706,568],{},[444,708,709],{},"Equals",[444,711,712],{},"ReferenceEquals",[437,714,715,722,727],{},[440,716,717,719,720,552],{},[444,718,568],{},": với reference type mặc định so sánh tham chiếu, trừ khi overload (như ",[444,721,471],{},[440,723,724,726],{},[444,725,709],{},": instance method, override được — so sánh logic.",[440,728,729,731],{},[444,730,712],{},": luôn so sánh tham chiếu, bỏ qua override.",[432,733,735,736,739],{"id":734},"_9-this-có-dùng-được-trong-static-method-không","9. ",[444,737,738],{},"this"," có dùng được trong static method không?",[497,741,742,745,746,748],{},[459,743,744],{},"Không."," Static method thuộc class, không có instance để ",[444,747,738],{}," trỏ tới. Lỗi compile.",[432,750,752,753,755,756,584],{"id":751},"_10-khi-nào-dùng-struct-khi-nào-dùng-class","10. Khi nào dùng ",[444,754,453],{},", khi nào dùng ",[444,757,468],{},[437,759,760,765],{},[440,761,762,764],{},[444,763,453],{},": dữ liệu nhỏ (≤ 16 bytes), không có identity, immutable thì càng tốt (Point, DateTime).",[440,766,767,769],{},[444,768,468],{},": object có behavior, share tham chiếu, kích thước lớn, cần kế thừa.",[427,771,773],{"id":772},"b-exception-null","B. Exception & null",[432,775,777,778,608,781,784],{"id":776},"_11-throw-vs-throw-ex-khác-gì","11. ",[444,779,780],{},"throw",[444,782,783],{},"throw ex"," — khác gì?",[437,786,787,797],{},[440,788,789,792,793,796],{},[444,790,791],{},"throw;"," → giữ nguyên ",[459,794,795],{},"stack trace"," gốc.",[440,798,799,802,803],{},[444,800,801],{},"throw ex;"," → reset stack trace, mất thông tin nơi lỗi ban đầu. ",[459,804,805],{},"Tránh.",[432,807,809,810,813,814,817],{"id":808},"_12-try-finally-không-có-catch-có-hợp-lệ-không","12. ",[444,811,812],{},"try \u002F finally"," không có ",[444,815,816],{},"catch"," có hợp lệ không?",[497,819,820,823],{},[459,821,822],{},"Có."," Dùng khi muốn cleanup (đóng file, dispose) nhưng vẫn để exception lan lên.",[432,825,827,828,831],{"id":826},"_13-using-block-thực-chất-là-gì","13. ",[444,829,830],{},"using"," block thực chất là gì?",[497,833,834,835,838,839,842,843,846,847,462],{},"Cú pháp tắt cho ",[444,836,837],{},"try \u002F finally { obj.Dispose(); }",". Object phải implement ",[444,840,841],{},"IDisposable",". C# 8+ có ",[444,844,845],{},"using var x = ..."," không cần ",[444,848,849],{},"{}",[432,851,853,854,857,858,861],{"id":852},"_14-và-làm-gì","14. ",[444,855,856],{},"??"," và ",[444,859,860],{},"??="," làm gì?",[437,863,864,880],{},[440,865,866,869,870,873,874,877,878,462],{},[444,867,868],{},"a ?? b",": nếu ",[444,871,872],{},"a"," null trả ",[444,875,876],{},"b",", ngược lại trả ",[444,879,872],{},[440,881,882,885,886,889,890,892],{},[444,883,884],{},"a ??= b",": gán ",[444,887,888],{},"a = b"," nếu ",[444,891,872],{}," đang null.",[432,894,896,897,900],{"id":895},"_15-null-conditional-là-gì","15. ",[444,898,899],{},"?."," (null-conditional) là gì?",[497,902,903,906,907,462],{},[444,904,905],{},"a?.B?.C"," — nếu bất kỳ phần nào null, trả về null, không throw ",[444,908,909],{},"NullReferenceException",[427,911,913],{"id":912},"c-collections-generic","C. Collections & Generic",[432,915,917,918,608,921,784],{"id":916},"_16-listt-vs-array-khác-gì","16. ",[444,919,920],{},"List\u003CT>",[444,922,923],{},"Array",[437,925,926,931],{},[440,927,928,930],{},[444,929,923],{},": size cố định, performance tốt nhất.",[440,932,933,935],{},[444,934,920],{},": size động, dùng array bên trong, double size khi đầy.",[432,937,939],{"id":938},"_17-generic-giải-quyết-vấn-đề-gì","17. Generic giải quyết vấn đề gì?",[437,941,942,945,948],{},[440,943,944],{},"Type safety compile-time (không cast).",[440,946,947],{},"Tránh boxing với value type.",[440,949,950],{},"Tái sử dụng code cho nhiều kiểu.",[432,952,954,955,608,958,584],{"id":953},"_18-dictionarykv-vs-hashsett","18. ",[444,956,957],{},"Dictionary\u003CK,V>",[444,959,960],{},"HashSet\u003CT>",[437,962,963,969],{},[440,964,965,968],{},[444,966,967],{},"Dictionary",": lưu cặp key → value, key unique.",[440,970,971,974],{},[444,972,973],{},"HashSet",": chỉ lưu element unique, dùng cho kiểm tra tồn tại nhanh.",[497,976,977],{},"Cả hai dùng hash, lookup O(1) avg.",[432,979,981,982,984],{"id":980},"_19-khi-nào-listt-resize","19. Khi nào ",[444,983,920],{}," resize?",[497,986,987,988,991],{},"Khi ",[444,989,990],{},"Count == Capacity",", tạo array mới gấp đôi rồi copy. Vì sao Add amortized O(1) — chi phí resize được trải đều.",[432,993,995,996,608,999,608,1002,584],{"id":994},"_20-ienumerable-vs-icollection-vs-ilist","20. ",[444,997,998],{},"IEnumerable",[444,1000,1001],{},"ICollection",[444,1003,1004],{},"IList",[437,1006,1007,1016,1025],{},[440,1008,1009,1012,1013,552],{},[444,1010,1011],{},"IEnumerable\u003CT>",": chỉ duyệt (",[444,1014,1015],{},"foreach",[440,1017,1018,1021,1022,462],{},[444,1019,1020],{},"ICollection\u003CT>",": thêm ",[444,1023,1024],{},"Add\u002FRemove\u002FCount",[440,1026,1027,1030,1031,857,1034,462],{},[444,1028,1029],{},"IList\u003CT>",": thêm indexer ",[444,1032,1033],{},"[i]",[444,1035,1036],{},"Insert\u002FRemoveAt",[497,1038,1039],{},"Khi định nghĩa API public, expose interface nhỏ nhất đủ dùng.",[432,1041,1043,1044,861],{"id":1042},"_21-yield-return-làm-gì","21. ",[444,1045,1046],{},"yield return",[497,1048,1049],{},"Tạo iterator lười — sinh từng phần tử khi được duyệt, không build toàn bộ collection.",[511,1051,1053],{"className":513,"code":1052,"language":515,"meta":516,"style":516},"public IEnumerable\u003Cint> Take5() {\n    for (int i = 0; i \u003C 5; i++) yield return i;\n}\n",[444,1054,1055,1060,1065],{"__ignoreMap":516},[520,1056,1057],{"class":522,"line":523},[520,1058,1059],{},"public IEnumerable\u003Cint> Take5() {\n",[520,1061,1062],{"class":522,"line":529},[520,1063,1064],{},"    for (int i = 0; i \u003C 5; i++) yield return i;\n",[520,1066,1067],{"class":522,"line":535},[520,1068,1069],{},"}\n",[427,1071,1073],{"id":1072},"d-oop-trong-c-method","D. OOP trong C# \u002F Method",[432,1075,1077],{"id":1076},"_22-overload-vs-override","22. Overload vs Override?",[437,1079,1080,1086],{},[440,1081,1082,1085],{},[459,1083,1084],{},"Overload",": cùng tên, khác signature, trong cùng class — compile-time.",[440,1087,1088,1091,1092,1095],{},[459,1089,1090],{},"Override",": redefine method ",[444,1093,1094],{},"virtual"," ở class con — runtime.",[432,1097,1099,1100,447,1102,447,1105,447,1108,584],{"id":1098},"_23-virtual-abstract-override-new","23. ",[444,1101,1094],{},[444,1103,1104],{},"abstract",[444,1106,1107],{},"override",[444,1109,1110],{},"new",[437,1112,1113,1118,1123,1128],{},[440,1114,1115,1117],{},[444,1116,1094],{},": cho phép class con override.",[440,1119,1120,1122],{},[444,1121,1104],{},": chỉ khai báo, class con bắt buộc implement.",[440,1124,1125,1127],{},[444,1126,1107],{},": class con redefine method virtual\u002Fabstract.",[440,1129,1130,1132],{},[444,1131,1110],{},": ẩn method của class cha (không polymorphism).",[432,1134,1136,1137,1140],{"id":1135},"_24-sealed-là-gì-dùng-khi-nào","24. ",[444,1138,1139],{},"sealed"," là gì, dùng khi nào?",[437,1142,1143,1149],{},[440,1144,1145,1148],{},[444,1146,1147],{},"sealed class",": không cho kế thừa.",[440,1150,1151,1154],{},[444,1152,1153],{},"sealed override",": class con không cho override tiếp.",[497,1156,1157],{},"Dùng cho Singleton, immutable class, hoặc lý do bảo mật\u002Fperformance.",[432,1159,1161],{"id":1160},"_25-method-chaining-viết-thế-nào","25. Method chaining — viết thế nào?",[497,1163,1164,1165,1167],{},"Method trả về ",[444,1166,738],{}," để gọi tiếp:",[511,1169,1171],{"className":513,"code":1170,"language":515,"meta":516,"style":516},"public class Query {\n    public Query Where(string c) { ... return this; }\n    public Query OrderBy(string c) { ... return this; }\n}\n",[444,1172,1173,1178,1183,1188],{"__ignoreMap":516},[520,1174,1175],{"class":522,"line":523},[520,1176,1177],{},"public class Query {\n",[520,1179,1180],{"class":522,"line":529},[520,1181,1182],{},"    public Query Where(string c) { ... return this; }\n",[520,1184,1185],{"class":522,"line":535},[520,1186,1187],{},"    public Query OrderBy(string c) { ... return this; }\n",[520,1189,1191],{"class":522,"line":1190},4,[520,1192,1069],{},[427,1194,1196],{"id":1195},"e-delegate-event-lambda","E. Delegate, Event, Lambda",[432,1198,1200],{"id":1199},"_26-delegate-là-gì","26. Delegate là gì?",[497,1202,1203],{},"Type-safe function pointer — biến giữ tham chiếu tới method (instance hoặc static) có signature khớp.",[432,1205,1207,1208,447,1211,447,1214,784],{"id":1206},"_27-action-func-predicate-khác-gì","27. ",[444,1209,1210],{},"Action",[444,1212,1213],{},"Func",[444,1215,1216],{},"Predicate",[437,1218,1219,1225,1235],{},[440,1220,1221,1224],{},[444,1222,1223],{},"Action\u003CT>",": không trả về.",[440,1226,1227,1230,1231,1234],{},[444,1228,1229],{},"Func\u003CT1, ..., TResult>",": trả về ",[444,1232,1233],{},"TResult"," (cuối).",[440,1236,1237,644,1240,462],{},[444,1238,1239],{},"Predicate\u003CT>",[444,1241,1242],{},"Func\u003CT, bool>",[432,1244,1246],{"id":1245},"_28-event-vs-delegate-public-vì-sao-event-tốt-hơn","28. Event vs Delegate public — vì sao event tốt hơn?",[497,1248,1249,1250,1253,1254,1257],{},"Class ngoài chỉ ",[444,1251,1252],{},"+="," \u002F ",[444,1255,1256],{},"-="," được — không thể invoke, không thể gán null xoá subscriber khác.",[432,1259,1261],{"id":1260},"_29-closure-trong-c-ví-dụ","29. Closure trong C# — ví dụ?",[497,1263,1264],{},"Lambda \"bắt\" biến từ scope ngoài:",[511,1266,1268],{"className":513,"code":1267,"language":515,"meta":516,"style":516},"int x = 10;\nFunc\u003Cint, int> add = n => n + x;\nx = 20;\nadd(5);   \u002F\u002F = 25 (đọc x mới nhất!)\n",[444,1269,1270,1275,1280,1285],{"__ignoreMap":516},[520,1271,1272],{"class":522,"line":523},[520,1273,1274],{},"int x = 10;\n",[520,1276,1277],{"class":522,"line":529},[520,1278,1279],{},"Func\u003Cint, int> add = n => n + x;\n",[520,1281,1282],{"class":522,"line":535},[520,1283,1284],{},"x = 20;\n",[520,1286,1287],{"class":522,"line":1190},[520,1288,1289],{},"add(5);   \u002F\u002F = 25 (đọc x mới nhất!)\n",[432,1291,1293,1294,584],{"id":1292},"_30-khi-nào-dùng-static-class","30. Khi nào dùng ",[444,1295,1296],{},"static class",[497,1298,1299,1300,447,1303,1306,1307,462],{},"Khi không cần instance — chỉ chứa utility method\u002Fextension. Ví dụ: ",[444,1301,1302],{},"Math",[444,1304,1305],{},"Console",", lớp chứa ",[444,1308,1309],{},"extension method",[427,1311,1313],{"id":1312},"f-linq","F. LINQ",[432,1315,1317],{"id":1316},"_31-linq-là-gì","31. LINQ là gì?",[497,1319,1320,1321,1323,1324,1327],{},"Language Integrated Query — cú pháp query trên collection (",[444,1322,998],{},"\u002F",[444,1325,1326],{},"IQueryable","). Thực chất là chuỗi extension method.",[432,1329,1331,1332,608,1335,584],{"id":1330},"_32-where-vs-select","32. ",[444,1333,1334],{},"Where",[444,1336,1337],{},"Select",[437,1339,1340,1345],{},[440,1341,1342,1344],{},[444,1343,1334],{},": filter — trả phần tử thoả điều kiện.",[440,1346,1347,1349],{},[444,1348,1337],{},": project — biến đổi từng phần tử.",[432,1351,1353,1354,608,1357,608,1360,584],{"id":1352},"_33-first-vs-firstordefault-vs-single","33. ",[444,1355,1356],{},"First",[444,1358,1359],{},"FirstOrDefault",[444,1361,1362],{},"Single",[437,1364,1365,1370,1375],{},[440,1366,1367,1369],{},[444,1368,1356],{},": trả phần tử đầu, không có → exception.",[440,1371,1372,1374],{},[444,1373,1359],{},": trả phần tử đầu, không có → default (null\u002F0).",[440,1376,1377,1379,1380,1383],{},[444,1378,1362],{},": yêu cầu ",[459,1381,1382],{},"đúng 1"," phần tử, nhiều hơn cũng exception.",[432,1385,1387,1388,608,1390,584],{"id":1386},"_34-ienumerable-vs-iqueryable","34. ",[444,1389,998],{},[444,1391,1326],{},[437,1393,1394,1399],{},[440,1395,1396,1398],{},[444,1397,998],{},": query chạy in-memory.",[440,1400,1401,1403],{},[444,1402,1326],{},": build expression tree → dịch sang SQL → chạy ở DB.",[497,1405,1406,1407,1409],{},"Trong EF Core, filter trên ",[444,1408,1326],{}," mới được đẩy xuống SQL.",[432,1411,1413],{"id":1412},"_35-deferred-execution-là-gì","35. Deferred execution là gì?",[497,1415,1416,1417,447,1420,447,1423,1426],{},"LINQ query không chạy ngay — chỉ chạy khi iterate (foreach) hoặc gọi ",[444,1418,1419],{},"ToList()",[444,1421,1422],{},"Count()",[444,1424,1425],{},"First()","...",[427,1428,1430],{"id":1429},"g-async-multithreading","G. Async \u002F Multithreading",[432,1432,1434,1435,1438],{"id":1433},"_36-asyncawait-có-tạo-thread-mới-không","36. ",[444,1436,1437],{},"async\u002Fawait"," có tạo thread mới không?",[497,1440,1441,1443,1444,1447],{},[459,1442,744],{}," Khi gặp ",[444,1445,1446],{},"await",", method giải phóng thread hiện tại, return Task. Khi I\u002FO xong, continuation được schedule tiếp (có thể trên thread khác).",[432,1449,1451],{"id":1450},"_37-task-vs-thread-khác-nhau","37. Task vs Thread khác nhau?",[437,1453,1454,1460],{},[440,1455,1456,1459],{},[444,1457,1458],{},"Thread",": OS thread, heavy.",[440,1461,1462,1465],{},[444,1463,1464],{},"Task",": abstraction trên ThreadPool, có giá trị trả về, hỗ trợ continuation, await, cancellation.",[432,1467,1469,1470,584],{"id":1468},"_38-khi-nào-dùng-taskrun","38. Khi nào dùng ",[444,1471,1472],{},"Task.Run",[497,1474,1475,1476,1479,1480,1482],{},"Chỉ cho ",[459,1477,1478],{},"CPU-bound"," — offload công việc nặng sang thread pool. I\u002FO-bound dùng ",[444,1481,1437],{}," trực tiếp.",[432,1484,1486,1487,1253,1490,1493],{"id":1485},"_39-vì-sao-tránh-result-wait-trên-task","39. Vì sao tránh ",[444,1488,1489],{},".Result",[444,1491,1492],{},".Wait()"," trên Task?",[497,1495,1496,1497,462],{},"Block thread → trong môi trường có SynchronizationContext (ASP.NET classic, WPF) → ",[459,1498,1499],{},"deadlock",[432,1501,1503,1504,1507],{"id":1502},"_40-async-void-có-nên-dùng","40. ",[444,1505,1506],{},"async void"," có nên dùng?",[497,1509,1510,1513],{},[459,1511,1512],{},"Không"," — trừ event handler. Không await được, exception bị nuốt.",[432,1515,1517,1518,1521],{"id":1516},"_41-lock-trong-c-bản-chất-là-gì","41. ",[444,1519,1520],{},"lock"," trong C# bản chất là gì?",[511,1523,1525],{"className":513,"code":1524,"language":515,"meta":516,"style":516},"lock (obj) { ... }\n",[444,1526,1527],{"__ignoreMap":516},[520,1528,1529],{"class":522,"line":523},[520,1530,1524],{},[497,1532,1533,1534,1537],{},"Tương đương ",[444,1535,1536],{},"Monitor.Enter(obj); try {...} finally { Monitor.Exit(obj); }",". Đảm bảo chỉ 1 thread vào critical section tại 1 thời điểm.",[432,1539,1541,1542,1545],{"id":1540},"_42-interlocked-dùng-khi-nào","42. ",[444,1543,1544],{},"Interlocked"," dùng khi nào?",[497,1547,1548,1549,1551],{},"Thao tác atomic trên primitive (Increment, Add, Exchange). Nhanh hơn ",[444,1550,1520],{}," cho counter đơn giản.",[432,1553,1555,1556,1559],{"id":1554},"_43-configureawaitfalse-để-làm-gì","43. ",[444,1557,1558],{},"ConfigureAwait(false)"," để làm gì?",[497,1561,1562],{},"Không cố quay về SynchronizationContext gốc sau await. Dùng trong library code để tránh deadlock và tăng performance.",[427,1564,1566],{"id":1565},"h-memory-gc","H. Memory & GC",[432,1568,1570],{"id":1569},"_44-garbage-collection-trong-net-hoạt-động-ra-sao","44. Garbage Collection trong .NET hoạt động ra sao?",[497,1572,1573,1574,1577],{},"GC theo ",[459,1575,1576],{},"generational",": Gen 0 (object mới), Gen 1, Gen 2 (sống lâu). GC quét Gen 0 thường xuyên, Gen 2 ít. Object không còn reference nào → bị thu hồi.",[432,1579,1581,1582,1559],{"id":1580},"_45-idisposable-để-làm-gì","45. ",[444,1583,841],{},[497,1585,1586,1587,1590,1591,462],{},"Cho phép release ",[459,1588,1589],{},"unmanaged resource"," (file handle, DB connection, socket). GC không tự lo unmanaged → cần ",[444,1592,1593],{},"Dispose()",[432,1595,1597,1598,608,1601,584],{"id":1596},"_46-finalize-vs-dispose","46. ",[444,1599,1600],{},"Finalize",[444,1602,1603],{},"Dispose",[437,1605,1606,1614],{},[440,1607,1608,1610,1611,1613],{},[444,1609,1603],{},": gọi thủ công \u002F qua ",[444,1612,830],{},", giải phóng resource ngay.",[440,1615,1616,1618],{},[444,1617,1600],{}," (~destructor): GC gọi trước khi reclaim, không định thời điểm — chỉ dùng cho safety net cho unmanaged resource.",[432,1620,1622],{"id":1621},"_47-memory-leak-có-thể-xảy-ra-trong-c-không","47. Memory leak có thể xảy ra trong C# không?",[497,1624,1625,1627,1628,1630],{},[459,1626,822],{}," Dù có GC, leak xảy ra khi reference vẫn còn — event handler chưa ",[444,1629,1256],{},", static collection giữ object, scoped service bị singleton ôm.",[427,1632,1634],{"id":1633},"i-c-913-features-modern","I. C# 9–13 Features (modern)",[432,1636,1638,1639,1642],{"id":1637},"_48-record-là-gì","48. ",[444,1640,1641],{},"record"," là gì?",[497,1644,1645,1646,1649,1650,1653],{},"Class\u002Fstruct với ",[459,1647,1648],{},"value semantics",": equality so sánh property, có ",[444,1651,1652],{},"with"," expression để clone-and-modify, ToString tự sinh.",[511,1655,1657],{"className":513,"code":1656,"language":515,"meta":516,"style":516},"public record User(string Name, int Age);\nvar u2 = u1 with { Age = 30 };\n",[444,1658,1659,1664],{"__ignoreMap":516},[520,1660,1661],{"class":522,"line":523},[520,1662,1663],{},"public record User(string Name, int Age);\n",[520,1665,1666],{"class":522,"line":529},[520,1667,1668],{},"var u2 = u1 with { Age = 30 };\n",[432,1670,1672],{"id":1671},"_49-pattern-matching-trong-c","49. Pattern matching trong C#?",[511,1674,1676],{"className":513,"code":1675,"language":515,"meta":516,"style":516},"if (obj is User { Age: > 18 } u) { ... }\nstring label = shape switch {\n    Circle c => \"circle\",\n    Square s => \"square\",\n    _ => \"unknown\"\n};\n",[444,1677,1678,1683,1688,1693,1698,1704],{"__ignoreMap":516},[520,1679,1680],{"class":522,"line":523},[520,1681,1682],{},"if (obj is User { Age: > 18 } u) { ... }\n",[520,1684,1685],{"class":522,"line":529},[520,1686,1687],{},"string label = shape switch {\n",[520,1689,1690],{"class":522,"line":535},[520,1691,1692],{},"    Circle c => \"circle\",\n",[520,1694,1695],{"class":522,"line":1190},[520,1696,1697],{},"    Square s => \"square\",\n",[520,1699,1701],{"class":522,"line":1700},5,[520,1702,1703],{},"    _ => \"unknown\"\n",[520,1705,1707],{"class":522,"line":1706},6,[520,1708,1709],{},"};\n",[432,1711,1713],{"id":1712},"_50-top-level-statements","50. Top-level statements?",[497,1715,1716,1717,1720],{},".NET 6+: ",[444,1718,1719],{},"Program.cs"," không cần class\u002FMain, viết code thẳng.",[511,1722,1724],{"className":513,"code":1723,"language":515,"meta":516,"style":516},"var builder = WebApplication.CreateBuilder(args);\nvar app = builder.Build();\napp.Run();\n",[444,1725,1726,1731,1736],{"__ignoreMap":516},[520,1727,1728],{"class":522,"line":523},[520,1729,1730],{},"var builder = WebApplication.CreateBuilder(args);\n",[520,1732,1733],{"class":522,"line":529},[520,1734,1735],{},"var app = builder.Build();\n",[520,1737,1738],{"class":522,"line":535},[520,1739,1740],{},"app.Run();\n",[432,1742,1744],{"id":1743},"_51-file-scoped-namespace","51. File-scoped namespace?",[511,1746,1748],{"className":513,"code":1747,"language":515,"meta":516,"style":516},"namespace MyApp.Services;   \u002F\u002F không cần { }\npublic class UserService {}\n",[444,1749,1750,1755],{"__ignoreMap":516},[520,1751,1752],{"class":522,"line":523},[520,1753,1754],{},"namespace MyApp.Services;   \u002F\u002F không cần { }\n",[520,1756,1757],{"class":522,"line":529},[520,1758,1759],{},"public class UserService {}\n",[432,1761,1763],{"id":1762},"_52-init-only-property","52. Init-only property?",[511,1765,1767],{"className":513,"code":1766,"language":515,"meta":516,"style":516},"public class User { public string Name { get; init; } }\nvar u = new User { Name = \"A\" };  \u002F\u002F OK\nu.Name = \"B\";   \u002F\u002F ❌ compile error\n",[444,1768,1769,1774,1779],{"__ignoreMap":516},[520,1770,1771],{"class":522,"line":523},[520,1772,1773],{},"public class User { public string Name { get; init; } }\n",[520,1775,1776],{"class":522,"line":529},[520,1777,1778],{},"var u = new User { Name = \"A\" };  \u002F\u002F OK\n",[520,1780,1781],{"class":522,"line":535},[520,1782,1783],{},"u.Name = \"B\";   \u002F\u002F ❌ compile error\n",[427,1785,1787],{"id":1786},"j-câu-gài-nâng-cao","J. Câu gài & nâng cao",[432,1789,1791,1792,608,1795,608,1798,584],{"id":1790},"_53-out-vs-ref-vs-in","53. ",[444,1793,1794],{},"out",[444,1796,1797],{},"ref",[444,1799,1800],{},"in",[437,1802,1803,1808,1813],{},[440,1804,1805,1807],{},[444,1806,1794],{},": phải gán bên trong method, không cần init.",[440,1809,1810,1812],{},[444,1811,1797],{},": phải init trước, hai chiều.",[440,1814,1815,1817],{},[444,1816,1800],{},": read-only reference, tránh copy struct lớn.",[432,1819,1821],{"id":1820},"_54-mutable-struct-có-nguy-hiểm-gì","54. Mutable struct có nguy hiểm gì?",[497,1823,1824,1825,1828],{},"Vì struct là value type, modify field qua property của copy không ảnh hưởng bản gốc. ",[459,1826,1827],{},"Khuyến cáo:"," struct nên immutable.",[432,1830,1832,1833,1835,1836,1839],{"id":1831},"_55-override-equals-thì-cũng-phải-override-gethashcode-vì-sao","55. Override ",[444,1834,709],{}," thì cũng phải override ",[444,1837,1838],{},"GetHashCode"," — vì sao?",[497,1841,1842,1843,1846,1847,1850,1851,1323,1853,1855],{},"Hợp đồng: ",[444,1844,1845],{},"a.Equals(b) == true"," → ",[444,1848,1849],{},"a.GetHashCode() == b.GetHashCode()",". Nếu vi phạm → ",[444,1852,967],{},[444,1854,973],{}," hoạt động sai.",[432,1857,1859,1860,1863],{"id":1858},"_56-params-keyword","56. ",[444,1861,1862],{},"params"," keyword?",[497,1865,1866],{},"Cho phép số đối số biến đổi:",[511,1868,1870],{"className":513,"code":1869,"language":515,"meta":516,"style":516},"public int Sum(params int[] nums) => nums.Sum();\nSum(1, 2, 3, 4);\n",[444,1871,1872,1877],{"__ignoreMap":516},[520,1873,1874],{"class":522,"line":523},[520,1875,1876],{},"public int Sum(params int[] nums) => nums.Sum();\n",[520,1878,1879],{"class":522,"line":529},[520,1880,1881],{},"Sum(1, 2, 3, 4);\n",[432,1883,1885],{"id":1884},"_57-extension-method-viết-thế-nào","57. Extension method viết thế nào?",[511,1887,1889],{"className":513,"code":1888,"language":515,"meta":516,"style":516},"public static class StringExt {\n    public static bool IsEmail(this string s) => s.Contains('@');\n}\n\"a@b.com\".IsEmail();\n",[444,1890,1891,1896,1901,1905],{"__ignoreMap":516},[520,1892,1893],{"class":522,"line":523},[520,1894,1895],{},"public static class StringExt {\n",[520,1897,1898],{"class":522,"line":529},[520,1899,1900],{},"    public static bool IsEmail(this string s) => s.Contains('@');\n",[520,1902,1903],{"class":522,"line":535},[520,1904,1069],{},[520,1906,1907],{"class":522,"line":1190},[520,1908,1909],{},"\"a@b.com\".IsEmail();\n",[432,1911,1913,1914,857,1917,584],{"id":1912},"_58-sự-khác-giữa-iequatabletequals-và-objectequals","58. Sự khác giữa ",[444,1915,1916],{},"IEquatable\u003CT>.Equals",[444,1918,1919],{},"object.Equals",[497,1921,1922,1925,1926,1929,1930,1933],{},[444,1923,1924],{},"IEquatable\u003CT>.Equals(T)"," strong-typed, không boxing. ",[444,1927,1928],{},"object.Equals(object)"," cần cast nội bộ. Implement ",[444,1931,1932],{},"IEquatable\u003CT>"," cho hiệu năng tốt trong Generic collection.",[432,1935,1937,1938,1863],{"id":1936},"_59-volatile-keyword","59. ",[444,1939,1940],{},"volatile",[497,1942,1943,1944,1946,1947,552],{},"Báo compiler không tối ưu cache giá trị field — luôn đọc\u002Fghi từ memory. Dùng cho variable share giữa thread (nhưng thường nên dùng ",[444,1945,1520],{}," hoặc ",[444,1948,1544],{},[432,1950,1952,1953,1956],{"id":1951},"_60-unsafe-block-dùng-khi-nào","60. ",[444,1954,1955],{},"unsafe"," block dùng khi nào?",[497,1958,1959,1960,1963],{},"Khi cần pointer (",[444,1961,1962],{},"int*",") — interop với native lib, performance critical code (image processing). Rất hiếm dùng trong dự án thường.",[432,1965,1967,1968,857,1971,1559],{"id":1966},"_61-spant-và-memoryt-để-làm-gì","61. ",[444,1969,1970],{},"Span\u003CT>",[444,1972,1973],{},"Memory\u003CT>",[497,1975,1976,1977,1980],{},"Đại diện đoạn liên tục bộ nhớ (slice của array\u002Fstring\u002Fstack-alloc) — không cấp phát mới. Tăng performance khi parse, không cần ",[444,1978,1979],{},"Substring"," tốn kém.",[432,1982,1984],{"id":1983},"_62-c-có-hỗ-trợ-đa-kế-thừa-class-không","62. C# có hỗ trợ đa kế thừa class không?",[497,1986,1987,1989,1990,462],{},[459,1988,1512],{}," với class — chỉ kế thừa 1 base class. Nhưng class có thể implement ",[459,1991,1992],{},"nhiều interface",[1994,1995],"hr",{},[497,1997,1998,1999],{},"➡️ Tiếp theo: ",[872,2000,2001],{"href":79},"Ngân hàng câu hỏi OOP & SOLID",[2003,2004,2005],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":516,"searchDepth":529,"depth":529,"links":2007},[2008,2028,2040,2053,2061,2070,2080,2097,2105,2113],{"id":429,"depth":529,"text":430,"children":2009},[2010,2011,2012,2014,2016,2018,2020,2022,2024,2026],{"id":434,"depth":535,"text":435},{"id":494,"depth":535,"text":495},{"id":555,"depth":535,"text":2013},"3. string là value type hay reference type?",{"id":576,"depth":535,"text":2015},"4. string immutable nghĩa là gì? Vì sao nên dùng StringBuilder?",{"id":603,"depth":535,"text":2017},"5. const vs readonly vs static readonly?",{"id":634,"depth":535,"text":2019},"6. Nullable type — int? thực chất là gì?",{"id":672,"depth":535,"text":2021},"7. var, dynamic, object khác nhau gì?",{"id":703,"depth":535,"text":2023},"8. So sánh ==, Equals, ReferenceEquals?",{"id":734,"depth":535,"text":2025},"9. this có dùng được trong static method không?",{"id":751,"depth":535,"text":2027},"10. Khi nào dùng struct, khi nào dùng class?",{"id":772,"depth":529,"text":773,"children":2029},[2030,2032,2034,2036,2038],{"id":776,"depth":535,"text":2031},"11. throw vs throw ex — khác gì?",{"id":808,"depth":535,"text":2033},"12. try \u002F finally không có catch có hợp lệ không?",{"id":826,"depth":535,"text":2035},"13. using block thực chất là gì?",{"id":852,"depth":535,"text":2037},"14. ?? và ??= làm gì?",{"id":895,"depth":535,"text":2039},"15. ?. (null-conditional) là gì?",{"id":912,"depth":529,"text":913,"children":2041},[2042,2044,2045,2047,2049,2051],{"id":916,"depth":535,"text":2043},"16. List\u003CT> vs Array — khác gì?",{"id":938,"depth":535,"text":939},{"id":953,"depth":535,"text":2046},"18. Dictionary\u003CK,V> vs HashSet\u003CT>?",{"id":980,"depth":535,"text":2048},"19. Khi nào List\u003CT> resize?",{"id":994,"depth":535,"text":2050},"20. IEnumerable vs ICollection vs IList?",{"id":1042,"depth":535,"text":2052},"21. yield return làm gì?",{"id":1072,"depth":529,"text":1073,"children":2054},[2055,2056,2058,2060],{"id":1076,"depth":535,"text":1077},{"id":1098,"depth":535,"text":2057},"23. virtual, abstract, override, new?",{"id":1135,"depth":535,"text":2059},"24. sealed là gì, dùng khi nào?",{"id":1160,"depth":535,"text":1161},{"id":1195,"depth":529,"text":1196,"children":2062},[2063,2064,2066,2067,2068],{"id":1199,"depth":535,"text":1200},{"id":1206,"depth":535,"text":2065},"27. Action, Func, Predicate — khác gì?",{"id":1245,"depth":535,"text":1246},{"id":1260,"depth":535,"text":1261},{"id":1292,"depth":535,"text":2069},"30. Khi nào dùng static class?",{"id":1312,"depth":529,"text":1313,"children":2071},[2072,2073,2075,2077,2079],{"id":1316,"depth":535,"text":1317},{"id":1330,"depth":535,"text":2074},"32. Where vs Select?",{"id":1352,"depth":535,"text":2076},"33. First vs FirstOrDefault vs Single?",{"id":1386,"depth":535,"text":2078},"34. IEnumerable vs IQueryable?",{"id":1412,"depth":535,"text":1413},{"id":1429,"depth":529,"text":1430,"children":2081},[2082,2084,2085,2087,2089,2091,2093,2095],{"id":1433,"depth":535,"text":2083},"36. async\u002Fawait có tạo thread mới không?",{"id":1450,"depth":535,"text":1451},{"id":1468,"depth":535,"text":2086},"38. Khi nào dùng Task.Run?",{"id":1485,"depth":535,"text":2088},"39. Vì sao tránh .Result \u002F .Wait() trên Task?",{"id":1502,"depth":535,"text":2090},"40. async void có nên dùng?",{"id":1516,"depth":535,"text":2092},"41. lock trong C# bản chất là gì?",{"id":1540,"depth":535,"text":2094},"42. Interlocked dùng khi nào?",{"id":1554,"depth":535,"text":2096},"43. ConfigureAwait(false) để làm gì?",{"id":1565,"depth":529,"text":1566,"children":2098},[2099,2100,2102,2104],{"id":1569,"depth":535,"text":1570},{"id":1580,"depth":535,"text":2101},"45. IDisposable để làm gì?",{"id":1596,"depth":535,"text":2103},"46. Finalize vs Dispose?",{"id":1621,"depth":535,"text":1622},{"id":1633,"depth":529,"text":1634,"children":2106},[2107,2109,2110,2111,2112],{"id":1637,"depth":535,"text":2108},"48. record là gì?",{"id":1671,"depth":535,"text":1672},{"id":1712,"depth":535,"text":1713},{"id":1743,"depth":535,"text":1744},{"id":1762,"depth":535,"text":1763},{"id":1786,"depth":529,"text":1787,"children":2114},[2115,2117,2118,2120,2122,2123,2125,2127,2129,2131],{"id":1790,"depth":535,"text":2116},"53. out vs ref vs in?",{"id":1820,"depth":535,"text":1821},{"id":1831,"depth":535,"text":2119},"55. Override Equals thì cũng phải override GetHashCode — vì sao?",{"id":1858,"depth":535,"text":2121},"56. params keyword?",{"id":1884,"depth":535,"text":1885},{"id":1912,"depth":535,"text":2124},"58. Sự khác giữa IEquatable\u003CT>.Equals và object.Equals?",{"id":1936,"depth":535,"text":2126},"59. volatile keyword?",{"id":1951,"depth":535,"text":2128},"60. unsafe block dùng khi nào?",{"id":1966,"depth":535,"text":2130},"61. Span\u003CT> và Memory\u003CT> để làm gì?",{"id":1983,"depth":535,"text":1984},"60+ câu hỏi C# fresher\u002Fjunior hay gặp nhất ở phỏng vấn .NET tại HCM — kèm đáp án ngắn gọn.","md",null,{},{"title":73,"icon":76},{"title":422,"description":2132},"CAfbrOwVXDrAX9U2kAXsAcBA23xBPLwZEhKrWPw7FPM",[2140,2142],{"title":62,"path":63,"stem":64,"description":2141,"icon":65,"children":-1},"STAR framework, giới thiệu bản thân PEEL, deal lương fresher .NET HCM, email follow-up. Mock 30 câu bấm giờ.",{"title":78,"path":79,"stem":80,"description":2143,"icon":81,"children":-1},"40+ câu hỏi OOP, SOLID, Design Pattern cho fresher .NET — kèm đáp án ngắn.",1783490351423]