c# - সফটওয - সি++ প্রোগ্রামিং




সি#লুকানো বৈশিষ্ট্য? (20)

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

শুধু এইটিকে স্পষ্ট করতে চেয়েছিলেন ... এটি পাল্টা অক্ষরগুলি উপেক্ষা করার জন্য এটি বলে না, এটি আসলে একটি আক্ষরিক রূপে স্ট্রিংটি ব্যাখ্যা করার জন্য কম্পাইলারকে বলে।

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

string s = @"cat
             dog
             fish"

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

cat
             dog
             fish

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

where T : struct

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

আমাদের কিছু এমনকি Generics , বেনামী ধরনের , lambdas , LINQ , মত স্টাফ mastered ...

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

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


কীওয়ার্ড

আরোপ করা

বাক্য গঠন

  • ?? kokos দ্বারা অপারেটর (coalesce nulls)
  • নিক Berardi দ্বারা সংখ্যা পতাকাঙ্কন
  • where T:new লার্স মাহলুমের where T:new
  • Keith দ্বারা অনুকূল Keith
  • Keith দ্বারা এক পরামিতি lambdas
  • Keith দ্বারা অটো বৈশিষ্ট্য
  • Keith দ্বারা নামস্থান alias
  • @ Patrick দ্বারা @ Verbatim স্ট্রিং অক্ষর
  • lfoust দ্বারা lfoust মান
  • @ ওয়ারিয়ালনামেস marxidad
  • event অপারেটর marxidad দ্বারা
  • Portman দ্বারা ফরম্যাট স্ট্রিং বন্ধনী
  • xanadont দ্বারা সম্পত্তি xanadont অ্যাক্সেসিবিলিটি xanadont
  • JasonS দ্বারা JasonS ( JasonS ) অপারেটর ( ?: JasonS
  • checked এবং unchecked অপারেটর Binoj Antony দ্বারা
  • Flory দ্বারা implicit and explicit অপারেটরদের

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

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

  • Himadri সম্পাদক পাঠ্য ব্লক নির্বাচন করুন
  • DannySmurf দ্বারা স্নিপেট

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

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

  • String.IsNullOrEmpty() পদ্ধতি KiwiBastard দ্বারা
  • List.ForEach() দ্বারা তালিকা। List.ForEach() পদ্ধতি
  • উইল ডিন দ্বারা BeginInvoke() , EndInvoke() পদ্ধতি
  • Nullable<T>.HasValue এবং Nullable<T>.HasValue Nullable<T>.Value দ্বারা Rismo বৈশিষ্ট্য
  • জন শেহান দ্বারা GetValueOrDefault পদ্ধতি

টিপস ও ট্রিকস

  • Andreas এইচআর Nilsson দ্বারা ইভেন্ট হ্যান্ডলার জন্য চমৎকার পদ্ধতি
  • John দ্বারা uppercase তুলনা
  • dp দ্বারা প্রতিফলন ছাড়া বেনামী ধরনের অ্যাক্সেস
  • ইচ্ছাকৃতভাবে সম্পদ সম্পত্তি তাত্ক্ষণিকভাবে তাত্ক্ষণিক একটি দ্রুত উপায়
  • roosteronacid দ্বারা জাভাস্ক্রিপ্ট-মত বেনামী ইনলাইন-ফাংশন

অন্যান্য


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

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

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


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

" yield " আমার মন আসতে হবে। DefaultValueAttribute মত কিছু বৈশিষ্ট্য আমার পছন্দসইগুলির মধ্যেও রয়েছে।

" var " শব্দটি একটু বেশি পরিচিত, কিন্তু আপনি এটি .NET 2.0 অ্যাপ্লিকেশানগুলিতেও ব্যবহার করতে পারেন (যতক্ষণ আপনি .NET 3.5 সংকলক ব্যবহার করেন এবং এটি আউটপুট 2.0 কোডে সেট করেন) খুব পরিচিত বলে মনে হচ্ছে না ভাল।

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


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

private IList<Foo> _foo;

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

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

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

এই ক্লাস দেওয়া হয়েছে:

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

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

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

ওয়েল, যে শক্তিশালী টাইপিং অভাব কারণে sucks। যদি আমি "SomeMethod" নামকরণ করি? এখন, 3.5 এর মধ্যে, আমি দৃঢ়ভাবে টাইপ করা ফ্যাশনটিতে এটি করতে পারি:

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);
    }
}

এই মুহূর্তে আমি ল্যামডাস এবং এক্সপ্রেশন ট্রিসের সাথে প্রেমে আছি।


আমি দেখি যে বেশিরভাগ C # ডেভেলপাররা 'অসম্পূর্ণ' ধরনের সম্পর্কে জানেন না। মূলত, একটি নিল মান থাকতে পারে যে primitives।

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

Nullable double, num1 , null তে সেট করুন, তারপর একটি নিয়মিত ডাবল, num2 , num1 বা -100 সেট করুন যদি সংখ্যা 1 নুল হয়।

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

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

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

এটা ফিরে String.Empty হয়। আরো বিস্তারিত জানার জন্য this লিঙ্কটি পরীক্ষা করে দেখুন


আমি বেশ কিছুক্ষণের জন্য "হিসাবে" শব্দ জানি না।

MyClass myObject = (MyClass) obj;

বনাম

MyClass myObject = obj as MyClass;

যদি obj একটি MyClass না হয় তবে দ্বিতীয়টি নিল ফিরে আসবে, বরং একটি ক্লাস কাস্ট ব্যতিক্রমটি নিক্ষেপ করবে।


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

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

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

কীওয়ার্ডের জন্য @ পরিবর্তনশীল নামগুলির জন্য @ ব্যবহার করুন।

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

সবকিছু, প্লাস

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

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

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

2) এক পরামিতি সঙ্গে সহজ lambdas:

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

3) বেনামে টাইপ এবং initialisers:

//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) অটো বৈশিষ্ট্য বিভিন্ন scopes থাকতে পারে:

public int MyId { get; private set; }

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

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

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

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

সাধারণ বৈশিষ্ট্য, কিন্তু সব DebuggerDisplay অধিকাংশ। আপনি বছর সংরক্ষণ করে।


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

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

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

Lambdas কিছু ফিরে প্রয়োজন এবং টাইপ পরিসংখ্যান এই মত প্রসঙ্গে অত্যন্ত শক্তিশালী।

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

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) =>

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

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


ইউনিয়নগুলি (সি ++ ভাগ করে নেওয়া স্মৃতির ধরন) বিশুদ্ধ, নিরাপদ সি #

অনিরাপদ মোড এবং পয়েন্টারগুলি অবলম্বন না করে, আপনি শ্রেণীকক্ষের একটি শ্রেণী / কাঠামোতে মেমরি স্থান ভাগ করতে পারেন। নিচের ক্লাসটি দেওয়া হয়েছে:

[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;
}

আপনি int32 ক্ষেত্র এবং vice versa manipulating দ্বারা বাইট ক্ষেত্রের মান পরিবর্তন করতে পারেন। উদাহরণস্বরূপ, এই প্রোগ্রামটি:

    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

শুধু System.Runtime.InteropServices ব্যবহার করে যোগ করুন;


একটি পদ্ধতি থেকে বেনামী ধরনের ফিরে এবং প্রতিফলন ছাড়া সদস্যদের অ্যাক্সেস।

// 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;
}

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

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

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


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

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"

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

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

সংকীর্ণ হতে পারে:

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

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

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

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


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

Environment.FailFast()




hidden-features