সি # এর লুকানো বৈশিষ্ট্য? [বন্ধ]


1475

এই প্রশ্নটি থেকে আমি নিম্নলিখিতটি শিখার পরে এটি আমার মনে আসে :

where T : struct

আমরা, সি # বিকাশকারীরা, সবাই সি # এর বেসিকগুলি জানি। আমি ঘোষণাপত্র, শর্তসাপেক্ষ, লুপস, অপারেটর ইত্যাদি mean

আমাদের মধ্যে কেউ কেউ জেনেরিক্স , বেনামে প্রকার , ল্যাম্বডাস , লিনকুই , ...

তবে সি # এর সবচেয়ে লুকানো বৈশিষ্ট্য বা কৌশলগুলি কী কী এমনকি সি # অনুরাগী, আসক্তি, বিশেষজ্ঞরা সবে জানেন?

এখানে এখন পর্যন্ত প্রকাশিত বৈশিষ্ট্য রয়েছে:


কীওয়ার্ড

আরোপ করা

বাক্য গঠন

ভাষার বৈশিষ্ট্য সমূহ

ভিজ্যুয়াল স্টুডিও বৈশিষ্ট্যগুলি

ফ্রেমওয়ার্ক

পদ্ধতি এবং বৈশিষ্ট্য

টিপস ও ট্রিকস

  • অ্যান্ড্রেস এইচআর নীলসন দ্বারা ইভেন্ট হ্যান্ডেলারদের জন্য দুর্দান্ত পদ্ধতি
  • জন দ্বারা বড় হাতের তুলনা
  • অ্যাক্সেস বেনামী দ্বারা প্রতিফলন ছাড়া ধরনের ডিপি
  • দ্বারা প্রখর রৌদ্রে instantiate সংগ্রহে বৈশিষ্ট্য একটি দ্রুত উপায় উইল
  • জাভাস্ক্রিপ্ট-এর মতো নামবিহীন ইনলাইন-ফাংশনগুলি রোস্টেরোনাসিড

অন্যান্য

উত্তর:


752

এটি প্রতি সেউ সি # নয়, তবে আমি এমন কাউকে দেখিনি যাঁরা সত্যই System.IO.Path.Combine()তাদের যতটা প্রয়োজন ব্যবহার করেন। আসলে, পুরো পাথ শ্রেণিটি সত্যই দরকারী, তবে কেউ এটি ব্যবহার করে না!

আমি বাজি রাখতে ইচ্ছুক যে প্রতিটা প্রোডাকশন অ্যাপ্লিকেশনটিতে এমন কোড না থাকা সত্ত্বেও নিম্নলিখিত কোড রয়েছে:

string path = dir + "\\" + fileName;

584

ল্যাম্বডাস এবং টাইপ অনুমানকে আন্ডাররেটেড করা হয়। লাম্বডাসের একাধিক বিবৃতি থাকতে পারে এবং সেগুলি স্বয়ংক্রিয়ভাবে একটি সামঞ্জস্যপূর্ণ প্রতিনিধি হিসাবে দ্বিগুণ হয়ে যায় (কেবল স্বাক্ষরের সাথে ম্যাচটি নিশ্চিত করুন):

Console.CancelKeyPress +=
    (sender, e) => {
        Console.WriteLine("CTRL+C detected!\n");
        e.Cancel = true;
    };

নোট করুন যে আমার কাছে না আছে new CancellationEventHandlerএবং আমার প্রকারগুলি নির্দিষ্ট করতে হবে senderএবং eসেগুলি ইভেন্ট থেকে অপ্রয়োজনীয়। এটি কেন পুরো লিখতে কম জটিল, delegate (blah blah)যার জন্য আপনাকে বিভিন্ন ধরণের পরামিতি নির্দিষ্ট করতে হবে।

ল্যাম্বডাসকে আর কিছু ফেরত দেওয়ার দরকার নেই এবং প্রকারের মতো অনুক্রমটি প্রকারের মধ্যে অত্যন্ত শক্তিশালী।

এবং বিটিডাব্লু , আপনি সর্বদা ল্যাম্বডাসকে ফিরিয়ে দিতে পারেন যা লাম্বদাসকে কার্যকরী প্রোগ্রামিং অর্থে তৈরি করে। উদাহরণস্বরূপ, এখানে একটি ল্যাম্বডা যা একটি ল্যাম্বডাকে তৈরি করে যা একটি বোতাম পরিচালনা করে। ইভেন্টটি ক্লিক করুন:

Func<int, int, EventHandler> makeHandler =
    (dx, dy) => (sender, e) => {
        var btn = (Button) sender;
        btn.Top += dy;
        btn.Left += dx;
    };

btnUp.Click += makeHandler(0, -1);
btnDown.Click += makeHandler(0, 1);
btnLeft.Click += makeHandler(-1, 0);
btnRight.Click += makeHandler(1, 0);

শৃঙ্খলা নোট করুন: (dx, dy) => (sender, e) =>

এখন সেজন্য আমি কার্যকরী প্রোগ্রামিং ক্লাস গ্রহণ করে খুশি :-)

সি এর পয়েন্টার ছাড়া অন্য, আমি মনে করি এটি আপনার অন্যান্য মৌলিক বিষয়টি শিখতে হবে :-)


528

রিক স্ট্রাল থেকে :

আপনি চেইন করতে পারেন ?? অপারেটর যাতে আপনি একগুচ্ছ নাল তুলনা করতে পারেন।

string result = value1 ?? value2 ?? value3 ?? String.Empty;

454

অ্যালাইজড জেনেরিকস:

using ASimpleName = Dictionary<string, Dictionary<string, List<string>>>;

এটি আপনাকে ASimpleNameপরিবর্তে ব্যবহার করতে দেয় Dictionary<string, Dictionary<string, List<string>>>

আপনি যখন অনেক জায়গায় একই জেনেরিক বড় দীর্ঘ জটিল জিনিস ব্যবহার করবেন তখন এটি ব্যবহার করুন।


438

সিএলআর থেকে সি # এর মাধ্যমে :

যখন স্বাভাবিক স্ট্রিং, এটা অত্যন্ত বাঞ্ছনীয় যে আপনি ToLowerInvariant পরিবর্তে ToUpperInvariant ব্যবহার কারণ মাইক্রোসফট তুলনা বড়হাতের করণ কোড অপ্টিমাইজ করেছে

আমি মনে করি এক সময় আমার সহকর্মী তুলনা করার আগে সবসময় স্ট্রিংকে বড় হাতের কাছে পরিবর্তন করেছিলেন। আমি সবসময় ভাবতাম যে সে কেন এমন হয় কারণ আমি অনুভব করি যে প্রথমে লোয়ারকেসে রূপান্তরিত হওয়া আরও "প্রাকৃতিক"। বইটি পড়ার পরে এখন জানি কেন।


254
আপনি যখন "স্ট্রিংকে আপার ক্ষেত্রে রূপান্তর করেন" আপনি একটি দ্বিতীয় অস্থায়ী স্ট্রিং অবজেক্ট তৈরি করেন। আমি ভেবেছিলাম যে এই ধরণের তুলনা পছন্দ করা হয়নি, সবচেয়ে ভাল উপায় ছিল: স্ট্রিং.একুয়ালস (স্ট্রিংএ, স্ট্রিংবি, স্ট্রিংকম্পায়ারেন্স।ক্র্যানাল কালচারআইগনরেস কেস) যে কোনওভাবে এই নিক্ষেপকারী স্ট্রিং তৈরি করে না।
অ্যান্টনি

32
লোয়ার কেস স্ট্রিংগুলিতে করা যায় না এমন বড় ধরনের স্ট্রিংগুলির তুলনা করতে আপনি কী ধরনের অপ্টিমাইজেশন করতে পারেন? আমি বুঝতে পারি না কেন একজনের চেয়ে অপরটি সর্বোত্তম হবে।
পরম্পা

36
ছোট হাতের চেয়ে বড় হাতের নাগালে রূপান্তর করা নির্দিষ্ট সংস্কৃতিতেও ভুল আচরণ রোধ করতে পারে। উদাহরণস্বরূপ, তুর্কি ভাষায়, একই বড় বড় আইতে দুটি ছোট ছোট আই-এর মানচিত্র more
নীল

34
আমি ToUpperInvariant বনাম ToLowerInvariant বেঞ্চমার্ক চেষ্টা করেছি। .NET 2.0 বা 3.5 এর অধীনে তাদের পারফরম্যান্সে আমি কোনও পার্থক্য খুঁজে পাচ্ছি না। অবশ্যই একে অপরকে ব্যবহার করে "অত্যন্ত সুপারিশকারী" ওয়ারেন্ট রয়েছে।
রাসমাস ফ্যাবার

19
টুঅপারআইভারেন্টকে পছন্দ করা হয় কারণ এটি সমস্ত অক্ষরকে রাউন্ড ট্রিপ করে তোলে। এমএসডিএন.মাইক্রোসফটকম /en-us/library/bb386042.aspx দেখুন । তুলনা করার জন্য, লিখুন"a".Equals("A", StringComparison.OrdinalIgnoreCase)
স্ল্যাक्स

408

আমার প্রিয় কৌশলটি নাল কোলেসেস অপারেটর এবং বন্ধনী ব্যবহার করে আমার জন্য স্বয়ংক্রিয়ভাবে সংগ্রহগুলি ইনস্ট্যান্টিয়েট করতে ব্যবহার করছে।

private IList<Foo> _foo;

public IList<Foo> ListOfFoo 
    { get { return _foo ?? (_foo = new List<Foo>()); } }

23
পড়তে কি কষ্ট হয় না?
রিরি

72
কিছুটা পড়ার পক্ষে কিছুটা শক্ত ... অভিজ্ঞ, অনভিজ্ঞ। তবে এটির কমপ্যাক্ট এবং এতে বেশ কয়েকটি নিদর্শন এবং ভাষার বৈশিষ্ট্য রয়েছে যা প্রোগ্রামারকে জানতে এবং বুঝতে হবে। সুতরাং, এটি প্রথমদিকে শক্ত থাকা সত্ত্বেও এটি শেখার কারণ হওয়ার সুবিধা দেয়।

38
অলস তাত্ক্ষণিকতা কিছুটা অপব্যবহার কারণ শ্রেণি আক্রমণকারীদের সম্পর্কে চিন্তাভাবনা এড়ানোর জন্য এটি দরিদ্র মানুষের পছন্দ। এটিতে একযোগে সমস্যা রয়েছে has
জন লেডেগ্রেন

17
আমাকে সর্বদা অবহিত করা হয়েছে এটি একটি খারাপ অভ্যাস, কোনও সম্পত্তি কল করা এমন কিছু করা উচিত নয়। যদি আপনার সেখানে সেট থাকে এবং মানটি বাতিল করে দেয় তবে আপনার এপিআই ব্যবহার করা কারও পক্ষে এটি খুব আশ্চর্যজনক হবে।
আয়ান

8
লিস্টওফফুকে বাতিল করতে @ জোয়েলকে বাদ দিয়ে নয় এটি ক্লাস চুক্তির অংশ নয় বা এটি ভাল অনুশীলনও নয়। সেজন্য কোনও সেটটার নেই। এই কারণেই তালিকার অফু কোনও সংগ্রহ ফেরত দেওয়ার গ্যারান্টিযুক্ত এবং কখনই শূন্য হয় না। এটি কেবল একটি খুব বিজোড় অভিযোগ যে আপনি যদি দুটি খারাপ কাজ করেন (একটি সেটর তৈরি করুন এবং একটি সংগ্রহটি বাতিল করুন) এটি আপনার প্রত্যাশা ভুল হওয়ার ফলস্বরূপ। আমি কোনওভাবেই গ্রাহকের মধ্যে পরিবেশ.এক্সিট () করার পরামর্শ দেব না। তবে এরও এই উত্তরটির সাথে কোনও সম্পর্ক নেই।

315

নাল ইভেন্ট হ্যান্ডলারের জন্য পরীক্ষা করা এড়িয়ে চলুন

ঘোষণার সময় ইভেন্টগুলিতে একটি খালি প্রতিনিধি যুক্ত করা, ইভেন্টটিকে কল্পনা করার আগে সর্বদা শূন্যতার জন্য পরীক্ষা করা প্রয়োজনকে দমন করে। উদাহরণ:

public delegate void MyClickHandler(object sender, string myValue);
public event MyClickHandler Click = delegate {}; // add empty delegate!

আপনি এটি করতে দিন

public void DoSomething()
{
    Click(this, "foo");
}

এর পরিবর্তে

public void DoSomething()
{
    // Unnecessary!
    MyClickHandler click = Click;
    if (click != null) // Unnecessary! 
    {
        click(this, "foo");
    }
}

দয়া করে এই বিষয়টি সম্পর্কিত (এবং সম্ভাব্য ডাউনসাইড) এরিক লিপার্টের এই সম্পর্কিত আলোচনা এবং এই ব্লগ পোস্টটিও দেখুন।


87
আমি বিশ্বাস করি আপনি যদি এই কৌশলটিতে নির্ভর করেন এবং তারপরে আপনাকে ক্লাসটি সিরিয়াল করতে হবে তবে একটি সমস্যা উপস্থিত হবে। আপনি ইভেন্টটি মুছে ফেলবেন, এবং এর পরে ডিসস্রায়ালাইজেশন করার পরে আপনি একটি নুলারফেরেন্স পাবেন। .... সুতরাং যে কেউ কেবল জিনিসগুলি করার "পুরানো পদ্ধতিতে" লেগে থাকতে পারে। এটি নিরাপদ।
সিরোক্কো

16
আপনি এখনও আপনার ইভেন্ট হ্যান্ডলারটিকে নালায় সেট করতে পারেন, যাতে আপনি এখনও নাল রেফারেন্স পেতে পারেন এবং আপনার এখনও একটি রেসের শর্ত রয়েছে।
রবার্ট পলসন

64
একটি দ্রুত প্রোফাইল পরীক্ষায় দেখা যায় যে নাল পরীক্ষা ছাড়াই ডামি-সাবস্ক্রাইব করা ইভেন্ট হ্যান্ডলারটি নাল পরীক্ষার সাথে সদস্যতা ছাড়াই ইভেন্ট হ্যান্ডলারটি প্রায় 2x সময় নেয়। নাল পরীক্ষা ছাড়াই মাল্টিকাস্ট ইভেন্ট হ্যান্ডলারটি নাল পরীক্ষার সাথে সিঙ্গেলকাস্ট ইভেন্ট হ্যান্ডলারের সময় প্রায় 3.5x নেয় takes
পি ড্যাডি

54
এটি সর্বদা স্ব-গ্রাহক হয়ে নাল চেকের প্রয়োজনীয়তা এড়ায়। এমনকি একটি খালি ইভেন্ট হিসাবে এটি একটি ওভারহেড বহন করে যা আপনি চান না। যদি কোনও গ্রাহক না থাকে তবে আপনি ইভেন্টটি একেবারেই চালিত করতে চান না, সর্বদা প্রথমে একটি খালি ডামি ইভেন্ট ফায়ার করবেন না। আমি এই খারাপ কোড বিবেচনা করবে।
কিথ

56
উপরের মন্তব্যে এই কারণগুলির জন্য এটি একটি ভয়ানক পরামর্শ। যদি আপনাকে অবশ্যই আপনার কোডটিকে "পরিষ্কার" চেহারা হিসাবে দেখিয়েছে, নাল পরীক্ষা করার জন্য একটি এক্সটেনশন পদ্ধতি ব্যবহার করুন তবে ইভেন্টটি কল করুন। পরিবর্তনযুক্ত সুবিধাসহ কারও অবশ্যই এই উত্তরে স্বতন্ত্র যোগ করা উচিত।
গ্রেগ

305

সব কিছু, আরও

1) অন্তর্নিহিত জেনেরিক (কেন কেবল পদ্ধতিতে এবং ক্লাসগুলিতে নয় কেন?)

void GenericMethod<T>( T input ) { ... }

//Infer type, so
GenericMethod<int>(23); //You don't need the <>.
GenericMethod(23);      //Is enough.

2) একটি প্যারামিটার সহ সরল ল্যাম্বডাস:

x => x.ToString() //simplify so many calls

3) বেনামে প্রকার এবং প্রারম্ভিক:

//Duck-typed: works with any .Add method.
var colours = new Dictionary<string, string> {
    { "red", "#ff0000" },
    { "green", "#00ff00" },
    { "blue", "#0000ff" }
};

int[] arrayOfInt = { 1, 2, 3, 4, 5 };

আরেকটা:

4) অটো বৈশিষ্ট্যগুলির বিভিন্ন স্কোপ থাকতে পারে:

public int MyId { get; private set; }

আমাকে স্মরণ করিয়ে দেওয়ার জন্য @ পাইকোকম্যানকে ধন্যবাদ:

৫) নেমস্পেসের উপাধি (এমন নয় যে আপনার সম্ভবত এই বিশেষ পার্থক্যের প্রয়োজন হবে):

using web = System.Web.UI.WebControls;
using win = System.Windows.Forms;

web::Control aWebControl = new web::Control();
win::Control aFormControl = new win::Control();

14
# 3 এ আপনি অঙ্কনীয় করতে পারেন an রেঞ্জ (1,5)
ইকোস্টর্ম

18
আমি মনে করি আপনি int [] সংখ্যাগুলি = {1,2,3} সহ অ্যারেগুলি শুরু করতে সক্ষম হয়েছেন; ১.০ :) যেহেতু "নতুন" কীওয়ার্ডেরও প্রয়োজন নেই
লুকাস

13
এছাড়াও ল্যাম্বদা বিনা পরামিতি () => ডসোমথিং ();
পাবলো রেটিক

5
আমি উভয় ব্যবহার করেছি {get; অভ্যন্তরীণ সেট; } এবং পেতে; সুরক্ষিত সেট; }, সুতরাং এই প্যাটার্নটি সামঞ্জস্যপূর্ণ।
কিথ

7
@ কির্ক ব্রডহার্স্ট - আপনি ঠিক বলেছেন - new web.Control()এই উদাহরণটিতেও কাজ করবে। ::সিনট্যাক্স বাহিনী এটি একটি নামস্থান ওরফে যেমন উপসর্গ চিকিত্সার জন্য, যাতে আপনি একটি বর্গ বলা যেতে পারে webএবং web::Controlযখন সিনট্যাক্স এখনও কাজ করবে, web.Controlসিনট্যাক্স বর্গ বা নামস্থান কি না চেক করতে জানি না। এর কারণে ::নেমস্পেসের এলিয়াসগুলি করার সময় আমি সর্বদা ব্যবহারের প্রবণতা রাখি ।
কিথ

286

আমি বেশ কিছুক্ষণ "হিসাবে" কীওয়ার্ডটি জানতাম না।

MyClass myObject = (MyClass) obj;

বনাম

MyClass myObject = obj as MyClass;

দ্বিতীয় ক্লাস কাস্ট ব্যতিক্রম ছুঁড়ে ফেলার পরিবর্তে যদি আপত্তি কোনও মাইক্লাস না হয় তবে দ্বিতীয়টি বাতিল হবে।


42
যদিও এটি বেশি করবেন না। প্রচুর লোকেরা এটিকে (টোটাইপ) এক্স এর শব্দার্থবিজ্ঞান সত্ত্বেও সিনট্যাক্স পছন্দ করতে বলে পছন্দ করেন।
স্কট ল্যাংহাম

4
আমি বিশ্বাস করি না এটি আরও ভাল পারফরম্যান্স দেয়। আপনি এটি প্রোফাইল করেছেন? (স্পষ্টতই যদিও কাস্ট ব্যর্থ হওয়ার পরে এটি ঘটে ... তবে আপনি যখন (মাই ক্লাস) castালাই ব্যবহার করেন তখন ব্যর্থতা ব্যতিক্রমী .. এবং অত্যন্ত বিরল (যদি সেগুলি কিছুতেই ঘটে)) তাই এতে কোনও পার্থক্য নেই
স্কট ল্যাংহ্যাম

7
এটি কেবলমাত্র আরও পারফরম্যান্ট যদি সাধারণ ক্ষেত্রে কাস্ট ব্যর্থ হয়। অন্যথায় সরাসরি castালাই (প্রকার) অবজেক্টটি দ্রুত। সরাসরি কাস্ট করতে ব্যর্থ হলেও নালাগুলি ফিরে আসার চেয়ে বেশি সময় লাগে।
স্প্যানস

15
"কীওয়ার্ড হিসাবে ... একই ধরণের লাইন বরাবর ..." "" কীওয়ার্ডটি ঠিক তেমন দরকারী।
dkpatt

28
আপনি এটির অপব্যবহার করতে পারেন এবং আপনার রাস্তাটি পরে নালারফেরান এক্সসেপশন রাখতে পারেন যখন আপনি আগে একটি অকার্যকর পরীক্ষাটি করতে পারতেন।
আন্দ্রে রিনিয়া

262

দুটি জিনিস যা আমি পছন্দ করি তা স্বয়ংক্রিয় বৈশিষ্ট্য যাতে আপনি আপনার কোডটি আরও নীচে নামাতে পারেন:

private string _name;
public string Name
{
    get
    {
        return _name;
    }
    set
    {
        _name = value;
    }
}

হয়ে

public string Name { get; set;}

আরজিকাল আরম্ভকারী:

Employee emp = new Employee();
emp.Name = "John Smith";
emp.StartDate = DateTime.Now();

হয়ে

Employee emp = new Employee {Name="John Smith", StartDate=DateTime.Now()}

6
এটিকে কী লক্ষ করা উচিত যে স্বয়ংক্রিয় বৈশিষ্ট্যগুলি কেবল একটি সি # 3.0 বৈশিষ্ট্যযুক্ত?
জারেড আপডেটে

21
স্বয়ংক্রিয় বৈশিষ্ট্যগুলি 3.0 সংকলক সহ প্রবর্তিত হয়েছিল। সংকলক যেহেতু 2.0 কোড আউটপুট সেট করতে পারে তাই তারা ঠিকঠাক কাজ করে। কোনও পুরানো সংকলকটিতে স্বয়ংক্রিয় বৈশিষ্ট্যগুলির সাথে 2.0 কোড সংকলনের চেষ্টা করবেন না!
জোশুয়া শ্যানন

74
অনেক লোক বুঝতে পারে না এমন কিছু হ'ল পান এবং সেটটির বিভিন্ন অ্যাক্সেসযোগ্যতা থাকতে পারে, যেমন: পাবলিক স্ট্রিংয়ের নাম {পান; ব্যক্তিগত সেট;}
নাদের শিরাজি

7
কেবলমাত্র স্বয়ংক্রিয় বৈশিষ্ট্যগুলির মধ্যে সমস্যা হ'ল এটি কোনও ডিফল্ট সূচনা মান সরবরাহ করা সম্ভব বলে মনে হয় না।
স্টেইন এসমুল

7
@ আনিভস: না, তা নয়। সেই পৃষ্ঠা থেকে: একটি ডিফল্টভ্যালুএট্রিবিউট কোনও সদস্যকে অ্যাট্রিবিউটের মান দিয়ে স্বয়ংক্রিয়ভাবে আরম্ভ করতে দেয় না। আপনাকে অবশ্যই আপনার কোডটিতে প্রাথমিক মানটি সেট করতে হবে। [DefaultValue]ডিজাইনারের জন্য ব্যবহার করা হয় যাতে এটি গা bold়ে কোনও সম্পত্তি প্রদর্শন করতে পারে (যার অর্থ অ-ডিফল্ট) knows
রজার লিপসক্বে

255

জেনেরিক ধরণের 'ডিফল্ট' কীওয়ার্ড:

T t = default(T);

টি যদি একটি রেফারেন্স টাইপ হয় তবে একটি 'নাল' ফলাফল দেয়, এবং 0 এটি কোনও ইনট হয়, মিথ্যা যদি এটি বুলিয়ান, ইত্যাদি হয়।


4
প্লাস: টাইপ? নুলযোগ্য <টাইপ> এর শর্টকাট হিসাবে। ডিফল্ট (int) == 0, কিন্তু ডিফল্ট (int?) == নাল।
সূর্যমুখী

226

বৈশিষ্ট্যগুলি সাধারণভাবে, তবে বেশিরভাগ ডিবাগারডিসপ্লে । আপনার বছর বাঁচায়।


9
ডিবাগারডিসপ্লে অ্যাট্রিবিউট (এমএসডিএন) ব্যবহার করে: এমএসডিএন.মিকায়সফ্রেসন /en-us/library/x810d419.aspx
জন অ্যাডামস

221

@ সংকলকটিকে একটি স্ট্রিংয়ে থাকা কোনও পালানোর অক্ষর উপেক্ষা করতে বলে।

কেবল এটিই পরিষ্কার করতে চেয়েছিল ... এটি পালানোর চরিত্রগুলিকে উপেক্ষা করতে বলে না, এটি আসলে সংকলককে স্ট্রিংটিকে আক্ষরিক হিসাবে ব্যাখ্যা করতে বলে।

যদি তোমার থাকে

string s = @"cat
             dog
             fish"

এটি প্রকৃতপক্ষে প্রিন্ট আউট করবে (দ্রষ্টব্য যে এটিতে অন্তর্ভুক্তির জন্য ব্যবহৃত সাদা স্থানও অন্তর্ভুক্ত রয়েছে):

cat
             dog
             fish

স্ট্রিংটিতে আপনি খালি করার জন্য যে সমস্ত স্পেস ব্যবহার করেছেন তা অন্তর্ভুক্ত করবে না?
অ্যান্ডি

18
হ্যাঁ এটিকে ভারব্যাটিম স্ট্রিং বলে।
জোয়ান ওয়েঙ্গেজ

4
এটি যদি আউটপুট শূন্যস্থানগুলি প্রিন্ট করা হয় তবে এটি আরও পরিষ্কার হবে। এখনই মনে হচ্ছে নতুন লাইনের চরিত্রগুলি মুদ্রিত থাকলেও স্পেসগুলি এড়ানো হবে।
আলেবেম

নিয়মিত এক্সপ্রেশন এবং দীর্ঘ এসকিউএল কোয়েরিগুলি এড়াতে খুব দরকারী।
ashes999

এটি এটিকে ম্যাপ {{করে {এবং এর }}জন্য }দরকারী করে তোলে string.Format()
ফের্রুসিও

220

আমি মনে করি সি # (.NET 3.5) এর সর্বাধিক প্রশংসিত এবং কম-পরিচিত বৈশিষ্ট্যগুলি হল এক্সপ্রেশন ট্রি , বিশেষত জেনারিকস এবং ল্যাম্বডাসের সাথে মিলিত হওয়ার পরে। এটি এনআইএনজেট এবং মোকের মতো আরও নতুন লাইব্রেরি ব্যবহার করছে এমন এপিআই তৈরির একটি পদ্ধতির।

উদাহরণস্বরূপ, ধরা যাক যে আমি একটি এপিআই দিয়ে একটি পদ্ধতি নিবন্ধন করতে চাই এবং সেই এপিআইটির পদ্ধতির নাম পাওয়া দরকার

এই শ্রেণি দেওয়া:

public class MyClass
{
     public void SomeMethod() { /* Do Something */ }
}

এর আগে, বিকাশকারীরা স্ট্রিং এবং প্রকারগুলি (বা স্ট্রিং-ভিত্তিক অন্য কোনও কিছু) দিয়ে এটি দেখতে খুব সাধারণ ছিল:

RegisterMethod(typeof(MyClass), "SomeMethod");

ভাল, শক্তিশালী-টাইপিংয়ের অভাবের কারণে এটি স্তন্যপান হয়। আমি যদি "সোমমেথোদ" নামকরণ করি? এখন, 3.5 এ আমি দৃ a়-টাইপিত ফ্যাশনে এটি করতে পারি:

RegisterMethod<MyClass>(cl => cl.SomeMethod());

যার মধ্যে নিবন্ধনমাঠোদ শ্রেণি এটি ব্যবহার করে Expression<Action<T>>:

void RegisterMethod<T>(Expression<Action<T>> action) where T : class
{
    var expression = (action.Body as MethodCallExpression);

    if (expression != null)
    {
        // TODO: Register method
        Console.WriteLine(expression.Method.Name);
    }
}

এটি এখনই ল্যাম্বডাস এবং এক্সপ্রেশন গাছের প্রেমে পড়ে যাওয়ার একটি বড় কারণ।


3
আমার একটি প্রতিচ্ছবি ইউটিলিটি ক্লাস রয়েছে যা ফিল্ডইনফো, প্রপার্টিআইএনফো ইত্যাদির সাথে একই রকম হয় ...
ওলমো

হ্যাঁ, এটি দুর্দান্ত। আমি EditValue(someEmployee, e => e.FirstName);আমার ব্যবসায়ের লজিকের মতো কোড লিখতে এই জাতীয় পদ্ধতি ব্যবহার করতে সক্ষম হয়েছি এবং নিজের সম্পত্তিটি সম্পাদনের জন্য ভিউমোডেল এবং ভিউর জন্য এটি সমস্ত প্লাম্বিং যুক্তি স্বয়ংক্রিয়ভাবে তৈরি করতে সক্ষম হয়েছে (সুতরাং, "প্রথম নাম" পাঠ্য সহ একটি লেবেল এবং এর সাথে একটি পাঠ্যবক্স) একটি বাঁধাই যা ব্যবহারকারীর নাম সম্পাদনা করার সময় ফার্স্টনেম সম্পত্তিটির সেটটারকে কল করে এবং গেটর ব্যবহার করে ভিউ আপডেট করে। এটি সি # তে বেশিরভাগ নতুন অভ্যন্তরীণ ডিএসএল-এর ভিত্তি বলে মনে হয়।
স্কট হুইটলক

4
আমি মনে করি এগুলি এতটা কম-বোধগম্য হিসাবে পরিচিত নয়।
জাস্টিন মরগান

আপনার কেন একটি পদ্ধতি নিবন্ধন করতে হবে? আমি এটি আগে কখনও ব্যবহার করি নি - এটি কখন এবং কখন ব্যবহৃত হবে?
মুনকনাইট

209

" ফলন " আমার মনে আসতে হবে। [ডিফল্টভ্যালু ()] এর মতো কয়েকটি বৈশিষ্ট্যও আমার পছন্দের মধ্যে রয়েছে।

" ভার " কীওয়ার্ডটি কিছুটা বেশি পরিচিত তবে আপনি এটি নেট .০.০ অ্যাপ্লিকেশনগুলিতেও ব্যবহার করতে পারবেন (যতক্ষণ আপনি । নেট 3.5.২ সংকলক ব্যবহার করেন এবং এটি আউটপুট ২.০ কোডে সেট করেন) মনে হয় না তেমন জানা যায় না আমরা হব.

সম্পাদনা: কোকোস, নির্দেশ করার জন্য ধন্যবাদ ?? অপারেটর, এটি সত্যিই দরকারী। যেহেতু এটির জন্য গুগল করা কিছুটা কঠিন (যেমন ?? কেবল উপেক্ষা করা হয়েছে), সেই অপারেটরের জন্য এখানে এমএসডিএন ডকুমেন্টেশন পৃষ্ঠা রয়েছে: ?? অপারেটর (সি # রেফারেন্স)


14
ডিফল্ট মানটির ডকুমেন্টেশন বলে যে এটি সত্যিই সম্পত্তিটির মান নির্ধারণ করছে না। এটি ভিজ্যুয়ালিজার এবং কোড জেনারেটরের জন্য কেবল সহায়ক।
বোরিস কলেনস

2
ডিফল্টভ্যালু হিসাবে: ইতিমধ্যে কিছু লাইব্রেরি এটি ব্যবহার করে। ASP.net এমভিসি একটি কন্ট্রোলার অ্যাকশনের প্যারামিটারগুলিতে ডিফল্টওয়্যালু ব্যবহার করে (যা অ-শূন্য প্রকারের জন্য খুব দরকারী)। কঠোরভাবে বলতে গেলে, এটি একটি কোড জেনারেটর হিসাবে মান সংকলক দ্বারা সেট করা হয় না তবে এমভিসি কোড দ্বারা by
মাইকেল স্টাম

6
নামটির জন্য ?? অপারেটর হলেন "নুল কোলেসিং" অপারেটর
আর্মস্ট্রোনজেট

ফলন আমার প্রিয়, কোলেসেস অপারেটর যদিও সেখানে আছে up আমি সিএএস, বা সমাবেশে স্বাক্ষরকারী, শক্ত নাম, জিএসি সম্পর্কে কিছুই দেখতে পাচ্ছি না ... আমি মনে করি কেবল সিএএস হ'ল সি ... তবে অনেক বিকাশকারীদের সুরক্ষা সম্পর্কে কোনও ধারণা নেই।
BrainSlugs83

198

আমি দেখতে পেয়েছি যে বেশিরভাগ সি # বিকাশকারীরা 'nullaable' প্রকারগুলি সম্পর্কে জানেন না। মূলত, আদিমগুলি যেগুলির নাল মান হতে পারে।

double? num1 = null; 
double num2 = num1 ?? -100;

শূন্য করতে একটি নল ডাবল, num1 , সেট করুন, তারপরে নিয়মিত ডাবল, num2 , num1 বা -100 নির্ধারণ করুন যদি num1 টি শূন্য থাকে।

http://msdn.microsoft.com/en-us/library/1t3y8s4s(VS.80).aspx

নলেবল টাইপ সম্পর্কে আরও একটি জিনিস:

DateTime? tmp = new DateTime();
tmp = null;
return tmp.ToString();

এটি স্ট্রিং.এম্পটি ফিরিয়ে দেয়। পরীক্ষা করে দেখুন এই আরো বিস্তারিত জানার জন্য লিংক


1
তারিখটাইম নালায় সেট করা যায় না।
জেসন জ্যাকসন

2
তাহলে কি "ইনট" কেবল সি # সিনট্যাকটিক চিনির জন্য System.Int32? প্রকৃতপক্ষে নলযোগ্য প্রকারের চারপাশে নির্মিত সংকলক সমর্থন রয়েছে যা তাদের বাতিল করে দেয়, উদাহরণস্বরূপ (যা একা জেনেরিক স্ট্রাইক ব্যবহার করে করা যায় না), এবং তাদের অন্তর্নিহিত ধরণের হিসাবে বক্সিং করে।
পি বাবা

4
@ পি বাবা - হ্যাঁ, সিস্টেমের জন্য সিনট্যাকটিক চিনি nt ইন্ট 32 nt তারা সম্পূর্ণ মত বদলে যায়? === Int32? === অবিচ্ছিন্ন <আইটি 32> === অযোগ্য <<>
সিজেকে

6
@ ট্যাগ: হ্যাঁ, ইনটি সিস্টেমের জন্য একটি উপনাম.আইটি 32 হিসাবে টি? নুলাবল <T> এর একটি উপাধি, তবে এটি কেবল সিনট্যাকটিক চিনি নয়। এটি ভাষার একটি সংজ্ঞায়িত অংশ। এলিয়াসগুলি কেবল কোডটি পড়া সহজ করে না, তবে আমাদের মডেলটিকে আরও ভাল ফিট করে। ডাবল হিসাবে নুলযোগ্য <ডাবল> প্রকাশ করছেন? দৃষ্টিকোণকে বোঝায় যে এইভাবে থাকা মানটি দ্বিগুণ (বা হতে পারে) কেবল ডাবল টাইপ করে কিছু জেনেরিক কাঠামো নয়। (অবিরত)
পি ড্যাডি

3
... যাই হোক না কেন, যুক্তিটি এলিয়াস সম্পর্কে ছিল না (এটি কেবল একটি দুর্বল উপমা ছিল, আমি মনে করি), তবে সেই নালাগুলি - আপনার পছন্দসই বাক্য গঠন যা ব্যবহার করা যায় - প্রকৃতপক্ষে একটি জেনেরিকের পণ্য নয়, একটি ভাষা বৈশিষ্ট্য। আপনি একমাত্র জেনেরিকের সাথে নালাবলির সমস্ত কার্যকারিতা (নাল, অপারেটর ফরোয়ার্ডিং, অন্তর্নিহিত ধরণের বা শূন্যের বক্সিং, নাল কোয়েলসিং এবং asঅপারেটরগুলির সাথে সামঞ্জস্যের তুলনা ) এর পুনরায় উত্পাদন করতে পারবেন না। অবিচ্ছিন্ন <T> একাকী প্রাথমিক এবং তাত্পর্যপূর্ণ থেকে অনেক দূরে, তবে ভাষার অংশ হিসাবে ন্যূনতম ধরণের ধারণাটি কিক গাধা।
পি ড্যাডি

193

এখানে কিছু অবিচ্ছিন্ন সি # কীওয়ার্ড আকারে আকর্ষণীয় কিছু লুকানো সি # বৈশিষ্ট্য রয়েছে:

__makeref

__reftype

__refvalue

__arglist

এগুলি অননুমোদিত সি # কীওয়ার্ড (এমনকি ভিজ্যুয়াল স্টুডিওগুলি তাদের স্বীকৃতি দেয়!) যা জেনারিকের আগে আরও দক্ষ বক্সিং / আনবক্সিংয়ের জন্য যুক্ত করা হয়েছিল। তারা System.TededReferences কাঠামোর সাথে সমন্বয় করে কাজ করে।

এখানে __arglist রয়েছে, যা পরিবর্তনশীল দৈর্ঘ্যের প্যারামিটার তালিকার জন্য ব্যবহৃত হয়।

লোকেরা সম্পর্কে খুব বেশি কিছু জানে না তারা হ'ল System.WeakReferences - একটি খুব দরকারী শ্রেণি যা কোনও জিনিসের উপর নজর রাখে কিন্তু তবুও আবর্জনা সংগ্রহকারীকে এটি সংগ্রহ করতে দেয়।

সবচেয়ে দরকারী "লুকানো" বৈশিষ্ট্যটি হ'ল ফলন ফেরতের কীওয়ার্ড। এটি সত্যই লুকানো নয়, তবে প্রচুর লোকেরা এটি সম্পর্কে জানেন না। লিনকিউ এর উপরে নির্মিত; এটি হুডের অধীনে একটি রাষ্ট্রীয় মেশিন তৈরি করে বিলম্ব-সম্পাদিত প্রশ্নের জন্য মঞ্জুরি দেয়। রেমন্ড চেন সম্প্রতি অভ্যন্তরীণ, কৌতুকপূর্ণ বিশদ সম্পর্কে পোস্ট করেছেন ।


2
পিটার ব্রমবার্গের অননুমোদিত কীওয়ার্ডগুলি সম্পর্কে আরও বিশদ । সেগুলি ব্যবহার করার কারণ আছে কিনা তা আমি এখনও পাই না।
হুবেজা

জেনারিক্সের আবির্ভাবের সাথে @ হুবেজা, __refType, __makeref এবং __refvalue ব্যবহার করার জন্য অনেকগুলি (কোনও?) ভাল কারণ নেই। নেট। 2-এ জেনারিকের আগে বক্সিং এড়ানোর জন্য এগুলি প্রাথমিকভাবে ব্যবহৃত হয়েছিল
যিহূদা গ্যাব্রিয়েল হিমাঙ্গো

ম্যাট,। নেট 2-তে জেনেরিকের পরিচয় দিয়ে, এই কীওয়ার্ডগুলি ব্যবহার করার খুব কম কারণ নেই কারণ তাদের উদ্দেশ্য ছিল মূল্য ধরণের সাথে মোকাবিলা করার সময় বক্সিং এড়ানো। হুবেজার লিঙ্কটি দেখুন, এবং কোডড্রোজেক্ট.com
যিহূদা গ্যাব্রিয়েল হিমাঙ্গো

185

ইউনিয়নগুলি (সি ++ ভাগ করা মেমরি ধরণের) খাঁটি, নিরাপদ সি # তে

অনিরাপদ মোড এবং পয়েন্টারগুলিকে অবলম্বন না করে আপনি ক্লাসের সদস্যদের ক্লাস / স্ট্রাক্টে মেমরির জায়গাগুলি ভাগ করতে পারেন। নিম্নলিখিত শ্রেণীর দেওয়া:

[StructLayout(LayoutKind.Explicit)]
public class A
{
    [FieldOffset(0)]
    public byte One;

    [FieldOffset(1)]
    public byte Two;

    [FieldOffset(2)]
    public byte Three;

    [FieldOffset(3)]
    public byte Four;

    [FieldOffset(0)]
    public int Int32;
}

আপনি ইনট 32 ক্ষেত্রটি এবং এর বিপরীতে কারিগরি দ্বারা বাইট ক্ষেত্রের মানগুলি সংশোধন করতে পারেন। উদাহরণস্বরূপ, এই প্রোগ্রাম:

    static void Main(string[] args)
    {
        A a = new A { Int32 = int.MaxValue };

        Console.WriteLine(a.Int32);
        Console.WriteLine("{0:X} {1:X} {2:X} {3:X}", a.One, a.Two, a.Three, a.Four);

        a.Four = 0;
        a.Three = 0;
        Console.WriteLine(a.Int32);
    }

এটি ফলাফল:

2147483647
FF FF FF 7F
65535

কেবলমাত্র সিস্টেম.আরটাইম.ইন্টার্পের সার্ভিস ব্যবহার করে যুক্ত করুন;


7
@ জর্জি, যখন আপনি সি ইউনিয়ন ঘোষণার সাহায্যে সকেটের মাধ্যমে উত্তরাধিকার অ্যাপ্লিকেশনগুলির সাথে যোগাযোগ করছেন তখন আশ্চর্য হয়ে কাজ করে।
স্কটম

2
অফসিটি 0 তে ইনট এবং ভাসমান অর্থপূর্ণও রয়েছে you এটি আপনার প্রয়োজন যদি আপনি কিছু সময় বিট মাস্ক হিসাবে ভাসমান পয়েন্ট সংখ্যাগুলি পরিচালনা করতে চান যা আপনি কখনও কখনও চান। বিশেষত যদি আপনি ভাসমান পয়েন্ট সংখ্যাগুলি সম্পর্কে নতুন কিছু জানতে চান।
জন লিডেগ্রেন

2
এই সম্পর্কে বিরক্তিকর বিষয়টি হল আপনি যদি এটি ব্যবহার করতে যাচ্ছেন তবে এটি একটি কাঠামোগত সংকলকটি আপনাকে init ফাংশনে সমস্ত ভেরিয়েবল সেট করতে বাধ্য করবে। সুতরাং আপনার যদি থাকে: সর্বজনীন A (int int32) 32 Int32 = int32; } এটি "ফিল্ড 'ওয়ান'কে অবশ্যই কলারে ফিরে আসার আগে অবশ্যই সম্পূর্ণরূপে নির্ধারিত হবে", সুতরাং আপনাকে এক = দুই = তিন = চার = 0 সেট করতে হবে; যেমন.
manixrock

2
এটির বেশিরভাগ বাইনারি ডেটা সহ এর ব্যবহার রয়েছে। আমি একটি ইন্টিওরিওন @ @ 0 এবং "0, 1, 2, এবং 3 চারটি উপাদানগুলির জন্য চার বাইট সহ" পিক্সেল "কাঠামো ব্যবহার করি এবং দ্রুত এবং সহজেই চিত্রের ডেটা ম্যানিপুলেট করার জন্য দুর্দান্ত।
ਸਨহার্ফ

57
সতর্কতা: এই পদ্ধতির পরিণতি বিবেচনা করে না। তার মানে আপনার সি # কোড সমস্ত মেশিনে একইভাবে চলবে না। লিটল-এন্ডিয়ান সিপিইউগুলিতে (যা প্রথমে কমপক্ষে উল্লেখযোগ্য বাইট সংরক্ষণ করে), প্রদর্শিত আচরণ ব্যবহার করা হবে। তবে বিগ-এন্ডিয়ান সিপিইউগুলিতে, বাইটগুলি আপনার প্রত্যাশার থেকে বিপরীত হবে। আপনি কীভাবে এটি উত্পাদন কোডটিতে ব্যবহার করেন সে সম্পর্কে সতর্ক হন - আপনার কোডটি নির্দিষ্ট মোবাইল ডিভাইস এবং অন্যান্য হার্ডওয়্যারের কাছে পোর্টেবল নাও হতে পারে এবং অ-সুস্পষ্ট উপায়ে বিভক্ত হতে পারে (যেমন দুটি ফর্মাল্ট একইরকম ফর্ম্যাটে তবে বাস্তবে বাইট ক্রমের বিপরীতে)।
রায় বার্নস

176

ভেরিয়েবল নামের জন্য কীওয়ার্ডের জন্য @ ব্যবহার করা।

var @object = new object();
var @string = "";
var @if = IpsoFacto(); 

38
আপনি কেন একটি ভেরিয়েবল নাম হিসাবে একটি কীওয়ার্ড ব্যবহার করতে চান? আমার কাছে মনে হচ্ছে এটি কোডটি কম পাঠযোগ্য এবং অচল করে দেবে।
জন

41
ওয়েল, এটির কারণটি হ'ল সিএলআই এর সাথে অন্য ভাষার সাথে আন্তঃব্যবহারের জন্য এটির প্রয়োজন যা সি # কীওয়ার্ডকে সদস্যের নাম হিসাবে ব্যবহার করতে পারে
মার্ক সিডাড

69
আপনি যদি কখনও এএসপিএন এমভিসি এইচটিএমএল সহায়ক ব্যবহার করতে এবং এইচটিএমএল ক্লাস সংজ্ঞায়িত করতে চান তবে আপনি @ ক্লাস ব্যবহার করতে পারবেন তা জানতে পেরে আপনি খুশি হবেন যাতে এটি শ্রেণীর কীওয়ার্ড হিসাবে স্বীকৃত হবে না
বরিস কলেনস

31
এক্সটেনশন পদ্ধতিগুলির জন্য দুর্দান্ত। পাবলিক স্ট্যাটিক অকার্যকর ডোসোমিংথিং (এই বার @ স্ট্রিং ফু) {...}
জোনাথন সি ডিকিনসন

45
@ অজিহোটকি: ভুল। var a = 5; Console.WriteLine (@a); মুদ্রণ 5
স্লাকস

168

যদি আপনি কোনও শেষ অবধি বা চূড়ান্তকরণকারীকে কল না করেই আপনার প্রোগ্রামটি থেকে বেরিয়ে যেতে চান তবে ফেলফাস্ট ব্যবহার করুন :

Environment.FailFast()

12
নোট করুন যে এই পদ্ধতিটি একটি মেমরি ডাম্প তৈরি করে এবং উইন্ডোজ ত্রুটি লগতে একটি বার্তা লিখে।
রিকএনজেড

1
এটি লক্ষ করা উচিত যে এই পদ্ধতিটি ব্যবহার করার সময় কোনও চূড়ান্তকরণকারী বা অ্যাপ্লিকেশন ডোমেন আনলোড ইভেন্টগুলি কল করা হবে না ...
অ্যাডওয়ার্ড কোডার

1
ইঙ্গিতটির জন্য +1, তবে এটি সি # নয়, এটি। নেট এর বিসিএল।
আবেল

সিস্টেম.ডায়াগনস্টিক্স.প্রসেস.গেটকন্ট্রনপ্রসেস ()। কিল () দ্রুত
টোলগাহান আলবায়ারাক

153

কোনও পদ্ধতি থেকে বেনামি ধরণগুলি ফিরিয়ে দেওয়া এবং প্রতিবিম্ব ছাড়াই সদস্যদের অ্যাক্সেস করা।

// Useful? probably not.
private void foo()
{
    var user = AnonCast(GetUserTuple(), new { Name = default(string), Badges = default(int) });
    Console.WriteLine("Name: {0} Badges: {1}", user.Name, user.Badges);
}

object GetUserTuple()
{
    return new { Name = "dp", Badges = 5 };
}    

// Using the magic of Type Inference...
static T AnonCast<T>(object obj, T t)
{
   return (T) obj;
}

42
এটি সত্যিই আপনার কিছুই পায় না। এটি আসলে বিপজ্জনক। যদি একাধিক প্রকার ফেরত পেতে গেটউজারটুপল সংশোধিত হয়? কাস্ট রান সময় ব্যর্থ হবে। নেট # /। নেট সম্পর্কে দুর্দান্ত জিনিসগুলির মধ্যে একটি হল কম্পাইল সময় পরীক্ষা করা। এটি কেবলমাত্র একটি নতুন ধরণের তৈরি করা ভাল।
জেসন জ্যাকসন

9
@ জেসন আমি বলেছিলাম এটি সম্ভবত কার্যকর নয় তবে এটি অবাক করে দেওয়ার (এবং আমি মনে করি লুকানো)।
ডেনিস ফিলিপস

31
শীতল থাকাকালীন, এটি একটি বরং দুর্বল নকশার পছন্দ বলে মনে হচ্ছে। আপনি মূলত দুটি জায়গায় বেনামে টাইপটি সংজ্ঞায়িত করেছেন। এই মুহুর্তে, কেবল একটি আসল কাঠামো ঘোষণা করুন এবং এটি সরাসরি ব্যবহার করুন।
পল আলেকজান্ডার

6
@ জর্জ: এই জাতীয় সম্মেলনকে ... স্ট্রাক্ট বলা হবে?
আর মার্টিনহো ফার্নান্দিস

2
এই কৌশলটির নাম দেওয়া হয়েছে 'নমুনা দ্বারা castালাই' এবং এটি যদি কার্যকর হয় না যে বেনামে টাইপ করে এমন পদ্ধতিটি অন্য কোনও সমাবেশে অবস্থিত it
ডেস্কো

146

নিয়মিত প্রকাশ এবং ফাইল পাথের জন্য এখানে একটি দরকারী:

"c:\\program files\\oldway"
@"c:\program file\newway"

@ সংকলকটিকে একটি স্ট্রিংয়ে থাকা কোনও পালানোর অক্ষর উপেক্ষা করতে বলে।


27
এছাড়াও, একটি @ ধ্রুবক ভিতরে নতুন লাইন গ্রহণ করে। কোনও স্ট্রিংয়ে মাল্টলাইন স্ক্রিপ্ট বরাদ্দ করার সময় পারফেক্ট।
টর হগেন

11
একটি উদ্ধৃতি চিহ্ন এড়াতে ভুলবেন না অন্য কথায়, তাদের দ্বিগুণ। [কোড] var ক্যান্ডি = @ "আমি" "লাল" "ক্যান্ডি বেত পছন্দ করি" "; [/ কোড]
ডেভ

5
আমি পাথ.কোমাইন দিয়ে পথ তৈরির প্রবণতা রাখি। আমি অবশ্যই রেগেক্সের জন্য @ ব্যবহার করব!
ড্যান ম্যাকক্লেইন

6
@ নতুন একটি কীওয়ার্ডের পরিবর্তে একটি পরিবর্তনশীল: @ এটি, @ আইটেন্ট, @ রিটার্ন, @ ইনটারফেস ... তাই তো :)
IAbstract

এটি কারও কাছাকাছি আসে না: তবে সি # এর সবচেয়ে লুকানো বৈশিষ্ট্য বা কৌশলগুলি কী কী এমনকি সি # ভক্ত, আসক্তি, বিশেষজ্ঞরা সবে জানেন?
publicgk

141

Mixins। মূলত, আপনি বেশ কয়েকটি ক্লাসে কোনও বৈশিষ্ট্য যুক্ত করতে চান, তবে তাদের সবার জন্য একটি বেস ক্লাস ব্যবহার করতে না পারলে, প্রতিটি শ্রেণি একটি ইন্টারফেস (কোনও সদস্যবিহীন) বাস্তবায়নের জন্য পান। তারপরে, ইন্টারফেসের জন্য একটি এক্সটেনশন পদ্ধতি লিখুন , যেমন

public static DeepCopy(this IPrototype p) { ... }

অবশ্যই, কিছু স্পষ্টতা ত্যাগ করা হয়। কিন্তু এটি কাজ করে!


4
হ্যাঁ আমি মনে করি এটি এক্সটেনশন পদ্ধতির আসল শক্তি। তারা মূলত ইন্টারফেস পদ্ধতি বাস্তবায়নের অনুমতি দেয়।
জন বুবরিস্কি

আপনি এনএইচবারনেট (বা ক্যাসেল অ্যাক্টিভেকর্ড) ব্যবহার করছেন এবং আপনার সংগ্রহের জন্য আপনাকে ইন্টারফেস ব্যবহার করতে হবে যদি এটি কার্যকরও হয়। এইভাবে আপনি সংগ্রহের ইন্টারফেসগুলিতে আচরণ দিতে পারেন।
রায়ান লুন্ডি

রেকর্ডের জন্য এটিই মূলত সমস্ত লাইনকিউ পদ্ধতি প্রয়োগ করা হয়।
ডাব্লুসিওয়েডিন

এখানে একটি লিঙ্ক যা আমি উপরে উল্লেখ করেছি সে সম্পর্কে কথা বলেছি, এনএইচবারনেট বা ক্যাসেল অ্যাক্টিভেকর্ডে সংগ্রহ ইন্টারফেসের সাথে এক্সটেনশন পদ্ধতিগুলি ব্যবহার করে: devlicio.us/blogs/billy_mccafferty/archive/2008/09/03/…
রায়ান লুন্ডি

7
কেবলমাত্র যদি তারা এক্সটেনশন বৈশিষ্ট্যগুলিকে অনুমতি দেয় !!!! আমি একটি এক্সটেনশন পদ্ধতি লিখতে পছন্দ করি না যা কেবল পঠনযোগ্য সম্পত্তি হতে ভিক্ষা করে ....
জন গিব

130

নিশ্চিত নয় কেন যে কেউ কেন নুলযোগ্য <বিউল> ব্যবহার করতে চান। :-)

সত্য, মিথ্যা, ফাইলনটফাউন্ড ?


87
যদি কোনও ব্যবহারকারী কোনও হ্যাঁ প্রশ্নের কোনও উত্তর দেওয়ার আশা করেন তবে যদি প্রশ্নের উত্তর না দেওয়া হয় তবে তা বাতিল হবে
ওমর কুহেজি

22
টেবিল কলামগুলি প্রায়শই nallable হয় যেখানে একটি ডাটাবেস সাথে মিথস্ক্রিয়া জন্য nullable প্রকারের সহজ হয়।
tuinstoel

11
হ্যাঁ, না, ক্যান?
ড্যান ব্লেয়ার

21
একটি থ্রিস্টেট চেকবক্সের মূল্য সঞ্চয় করুন
শিমি ওয়েটজ্যান্ডলার

8
এসকিউএল হিসাবে: হ্যাঁ / না / অজানা।
এরিক্ক্যালেন

116

এটির নামানুসারে এতটা "লুকানো" নয়।

অ্যালগরিদম "মানচিত্র", "হ্রাস", এবং "ফিল্টার" এর প্রতি প্রচুর মনোযোগ দেওয়া হয়। বেশিরভাগ লোকেরা যা বুঝতে পারে না তা হ'ল নেট 3.5.৩ এই তিনটি অ্যালগোরিদম যুক্ত করেছে, তবে এটি লিনক-এর অংশ হ'ল এই তথ্যের ভিত্তিতে এটি তাদের খুব এসকিউএল-ইশ নাম দিয়েছে।

"মানচিত্র" =>
এক ফর্ম থেকে অন্য রূপে ডেটা ট্রান্সফর্ম নির্বাচন করুন

"হ্রাস" =>
একক ফলাফলগুলিতে সমষ্টিগত সমষ্টি মানগুলি

"ফিল্টার" => যেখানে
কোনও মানদণ্ডের ভিত্তিতে ডেটা ফিল্টার করা হয়

পুনরাবৃত্তি এবং শর্তাবলীর জন্য ব্যবহৃত সংগ্রহগুলিতে ইনলাইন কাজ করার জন্য লিনকিউ ব্যবহারের ক্ষমতা অবিশ্বাস্যভাবে মূল্যবান হতে পারে। সমস্ত লিনিক্যু এক্সটেনশান পদ্ধতি কীভাবে আপনার কোডটিকে আরও বেশি কমপ্যাক্ট এবং রক্ষণাবেক্ষণযোগ্য করে তুলতে সহায়তা করতে পারে তা শিখার মতো।


1
সিলেক্টে মোনাডসে "রিটার্ন" ফাংশনের মতো কাজ করেও। স্ট্যাকওভারফ্লো
মার্ক সিডেড

1
আপনি যদি এসকিউএলআইএস সিনট্যাক্স ব্যবহার করেন তবে "নির্বাচন করুন" ব্যবহার করা দরকার। আপনি যদি এক্সটেনশন পদ্ধতির সিনট্যাক্স ব্যবহার করেন - কিছু সংগ্রহ here যেখানে (আইটেম => আইটেম r দাম> 5.99 এম) - নির্বাচিত বিবৃতি ব্যবহারের প্রয়োজন নেই।
ব্র্যাড উইলসন

7
@ ব্র্যাড, এটি (যেখানে) একটি ফিল্টার অপারেশন। নির্বাচন না করে মানচিত্রের অপারেশন করার চেষ্টা করুন ...
এলওফ

2
: LINQ বড় বিষয় যে আমার মতে সি # ঘটেছে হয় stackoverflow.com/questions/2398818/...
Leniel Maccaferri

1
সমষ্টিটির ক্ষুদ্রতম স্বাক্ষর হ'ল "হ্রাস" ফাংশন, সমষ্টিটির মধ্য স্বাক্ষরটি আরও বেশি শক্তিশালী "ভাঁজ" ফাংশন!
ব্রেট ওয়াইড্মিয়ার

115
Environment.NewLine

সিস্টেম স্বাধীন newlines জন্য।


10
এই সম্পর্কে বিরক্তিকর বিষয় হ'ল এটি कॉम्प্যাক্ট ফ্রেমওয়ার্কের অন্তর্ভুক্ত নয়।
স্টোরমনেট

14
এটি অ্যাপ্লিকেশনটির হোস্ট প্ল্যাটফর্মের সাথে সুনির্দিষ্টভাবে উল্লেখ করার মতো - তাই যদি আপনি অন্য সিস্টেমের জন্য ডেটা তৈরি করে থাকেন তবে আপনার যথাযথভাবে \ n বা \ r \ n ব্যবহার করা উচিত।
জাল

এটি .NET এর বিসিএলের অংশ, প্রতি # সি # এর বৈশিষ্ট্য নয়।
হাবিল

111

যদি আপনি স্ট্রিং.ফর্ম্যাট এক্সপ্রেশনটির ভিতরে কোঁকড়ানো বন্ধনী ব্যবহার করার চেষ্টা করছেন ...

int foo = 3;
string bar = "blind mice";
String.Format("{{I am in brackets!}} {0} {1}", foo, bar);
//Outputs "{I am in brackets!} 3 blind mice"

19
@ কিরলেসা: আসলে, হ্যাঁ, এগুলি ধনুর্বন্ধনী, তবে "কোঁকড়ানো বন্ধনী" তাদের একটি বিকল্প নাম। [এবং ]বর্গাকার বন্ধনী এবং <এবং >কোণ বন্ধনী হয়। En.wikedia.org/wiki/Braket দেখুন ।
অ্যাক্টুফয়ে

4
আপনি সঠিক. কিন্তু যখন আমি মন্তব্য করেছি, এটি "কোঁকড়ানো" বন্ধনী বলেনি।
রায়ান লুন্ডি

2
খুব সুন্দর একটি উল্লেখ করতে। আমার প্রথম স্ট্রিংটি মনে রাখুন Forফর্ম্যাটটি দেখে মনে হয়েছিল: স্ট্রিং Forফর্ম্যাট ("{0} আমি কোঁকড়া বন্ধনী {1} {2} {3}", "{", "}", 3, "অন্ধ ইঁদুর"); একবার আমি জানতে পেরেছিলাম যে এগুলি থেকে পালানো is {এবং using using ব্যবহার
করেই

মুআাহাহাহা ... প্রোগ্রামিং ইতিমধ্যে 3 বছর পরে হয়েছে। নেট এবং আমি এইটি জানি না। : ডি
আরনিস ল্যাপসা

"কোঁকড়ানো" বন্ধনীগুলি অব্যাহতি ক্রমের অনুরূপ অভিনয় করে ??
প্রতীক

104
  1. ?? - coalescing অপারেটর
  2. ব্যবহার ( বিবৃতি / নির্দেশ) ) - দুর্দান্ত কীওয়ার্ড যা কেবল ডিসপোজকে কল করার চেয়েও বেশি ব্যবহার করা যেতে পারে
  3. পঠনযোগ্য - আরও ব্যবহার করা উচিত
  4. নেটমডিউলগুলি - খুব খারাপ ভিজ্যুয়াল স্টুডিওতে কোনও সমর্থন নেই

6
ব্যবহার করে আরও সুবিধাজনক স্ট্রিংয়ের লম্বা নামস্থানটি উপাধিতে ব্যবহার করা যেতে পারে, যেমন: জিপইনকোড = মাইকম্পানি. ইউটিলিটি কোড.কম্প্রেশন.জাইপ.এনকোডিং; এখানে আরও রয়েছে: এমএসডিএন.মাইক্রোসফটকম /en-us/library/sf0df423.aspx
ডেভ আর।

2
এটা আসলে একই জিনিস নয়। ডিসপোজ কল করার সময়, আপনি ব্যবহারের বিবৃতিটি ব্যবহার করতে পারেন, যখন কোনও ধরণের এলিয়াসিং আপনি কোনও ব্যবহার নির্দেশিকা ব্যবহার করছেন।
vyvind Skaar

2
ঠিক যদি আপনি # 1-তে একটি নাম চান (যেমন আপনি টার্নারি অপারেটরের সাথে করেছিলেন), ?? একে নাল কোলেসিং অপারেটর বলা হয়।
জে। স্টিন

4
@ লুকাশআর্দ্বার্ক: জে স্টিন উল্লেখ করেছেন যে এটিকে নাল কোয়েলসিং অপারেটর বলা হয়। তার জন্য অনুসন্ধান করুন!
কোকোস

1
অনুসন্ধান করার জন্য ?? গুগলে চেষ্টা করুন অপারেটর: google.com/search?q=c%23+%3F%3F+operator
ব্যাকস্ল্যাশ 17

103

@ এড, আমি এটি পোস্ট করা সম্পর্কে কিছুটা স্বচ্ছন্দ কারণ এটি নিটপিকিংয়ের চেয়ে কিছুটা বেশি। যাইহোক, আমি আপনার কোডের নমুনায় এটি উল্লেখ করব:

MyClass c;
  if (obj is MyClass)
    c = obj as MyClass

আপনি যদি 'ইজ' ব্যবহার করতে চলেছেন, তবে কেন এটি 'হিসাবে' ব্যবহার করে নিরাপদ কাস্টের সাহায্যে অনুসরণ করবেন? আপনি যদি নিশ্চিত হয়ে থাকেন যে আপত্তিটি সত্যই মাই ক্লাস, একটি বগ স্ট্যান্ডার্ড কাস্ট:

c = (MyClass)obj

... কখনও ব্যর্থ হবে না।

একইভাবে, আপনি কেবল বলতে পারেন:

MyClass c = obj as MyClass;
if(c != null)
{
   ...
}

নিশ্চিত হওয়ার জন্য .NET এর অন্তর্গত সম্পর্কে আমি পর্যাপ্ত পরিমাণে জানি না, তবে আমার প্রবৃত্তিগুলি আমাকে বলে যে এটি সর্বোচ্চ দুটি ধরণের কাস্ট অপারেশনকে সর্বাধিক একটিতে নামিয়ে আনবে। প্রক্রিয়াজাতকরণ ব্যাংকটি কোনওভাবেই ভেঙে যাওয়ার সম্ভাবনা নেই; ব্যক্তিগতভাবে, আমি মনে করি যে পরবর্তী রূপটি আরও পরিষ্কার দেখাচ্ছে।


16
যদি কাস্টটি হুবহু টাইপের হয় (যখন "A" তে বস্তুটি "A" হয়, তখন তা উত্পন্ন হয় না), সরাসরি theালাই "হিসাবে" থেকে FA 3x FASTER হয়। যখন একটি উদ্ভূত প্রকারের কাস্টিং করা হয় (যখন "A" থেকে বস্তু "B" হয় তখন "A" তে কাস্ট করা হয়), সরাসরি castালাই "হিসাবে" এর চেয়ে ~ 0.1x ধীর হয় is "হয়", তারপরে "হিসাবে" কেবল নির্বোধ।
পি বাবা

2
না, তবে আপনি "যদি (মাই ক্লাস হিসাবে c = আপত্তি) লিখতে পারেন! = নাল)"
ডেভ ভ্যান ডেন এয়েণ্ডে

10
isএবং asব্যবহারকারী কাস্ট করবেন না। সুতরাং, উপরোক্ত কোডটি isঅপারেটরের সাথে জিজ্ঞাসা করছে যদি মাই ক্লাস থেকে উত্পন্ন হয় (বা কোনও অন্তর্ভুক্ত সিস্টেমের সংজ্ঞায়িত কাস্ট রয়েছে)। এছাড়াও, isব্যর্থ null। এই কোড উভয়ই আপনার কোডের জন্য গুরুত্বপূর্ণ হতে পারে। উদাহরণস্বরূপ, আপনি লিখতে চাইতে পারেন: if( obj == null || obj is MyClass ) c = (MyClass)obj; তবে এটি সম্পূর্ণরূপে পৃথক: try { c = (MyClass)obj; } catch { }যেহেতু প্রাক্তন কোনও ব্যবহারকারী সংজ্ঞায়িত রূপান্তরগুলি সম্পাদন করবে না, তবে পরবর্তীটি করবে will ছাড়া nullচেক, সাবেক সেট করা হবে না cযখন objহয় null
অ্যাডাম লুটার

2
আইএল-তে, একটি কাস্ট একটি কাস্টক্লাসে যায় তবে একটি আইএসআইএনএসটি নির্দেশিকায় যায় as
জন গিব

5
আমি এই জন্য একটি পরীক্ষা দৌড়ে ভোটদান IEnumerable<int>থেকে List<int>হয়ে কাস্ট object( new object()করা) IEnumerable<int>, নিশ্চিত কোন ভুল আছেন: সরাসরি নিক্ষিপ্ত: 5.43ns, যা-> হিসাবে ঢালাই: নিক্ষিপ্ত যেমন 6.75ns: 5.69ns। তারপরে অবৈধ কাস্টগুলি: সরাসরি castালাই: 3125000ns, castালাই হিসাবে: 5.41ns পরীক্ষা করা হচ্ছে। উপসংহার: 1% ফ্যাক্টর সম্পর্কে উদ্বিগ্ন হওয়া বন্ধ করুন এবং কাস্টিং অবৈধ হতে পারে হিসাবে আপনি ব্যবহার করছেন / ঠিক তা নিশ্চিত করুন, কারণ ব্যতিক্রমগুলি (পরিচালনা করা থাকলেও) কাস্টিংয়ের তুলনায় খুব ধীর, আমরা 578000 ধীর একটি ফ্যাক্টরের কথা বলছি। মনে রাখবেন যে শেষ অংশটি,
বাকীগুলি কিছু যায়

98

সম্ভবত কোনও উন্নত কৌশল নয়, তবে একটি আমি সব সময় দেখি যা আমাকে পাগল করে তোলে:

if (x == 1)
{
   x = 2;
}
else
{
   x = 3;
}

এটিকে ঘনীভূত করা যেতে পারে:

x = (x==1) ? 2 : 3;

10
আমার গ্রুপে টার্নারি অপারেটরটিকে নিষিদ্ধ করা হয়েছে। কিছু লোক কেবল এটি পছন্দ করে না, যদিও আমি তা কখনই বুঝতে পারি নি।
জাস্টিন আর

13
আমার ধারণা, কারণ তারা একই জিনিস নয়, অপারেটর হয়ে স্টেটমেন্ট নয়। আমি নিজেই প্রথম পদ্ধতির পছন্দ করি। এটি আরও সুসংগত এবং সহজেই প্রসারিত। অপারেটররা বিবৃতি ধারণ করতে পারে না, সুতরাং আপনি যে মুহুর্তে শরীরটি প্রসারিত করতে হবে, আপনাকে সেই
বার্ষিক

16
x ++ তে ঘনীভূত হতে পারে; ঠিক আছে এটি অর্থহীন ^^
ফ্রেঞ্চোইস

5
@ গুইলিউম: x: x = 2 + System.Math.Min (1, System.Math.Abs ​​(x-1)) এর সমস্ত মানের জন্য অ্যাকাউন্টে;
এমবিকেশ

38
এটিকে আসলে "শর্তসাপেক্ষ অপারেটর" বলা হয় - এটি একটি টের্নারি অপারেটর কারণ এটি তিনটি আর্গুমেন্ট নেয় takes en.wikipedia.org/wiki/Conditional_operator
Blorgbeard বাইরে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.