C# & .Net Flashcards

(49 cards)

1
Q

تعریف متود
static
چه فایده ای دارد؟

A

با استفاده از متود استاتیک در یک کلاس می توانیم بدون ایجاد یک شی از آن کلاس به این متود دسترسی پیدا کنیم.
تعریف متدهای استاتیک می تواند به الگوی
factory pattern
کمک کند و به عنوان یک کارخانه عمل کند و نمونه هایی از آن کلاس را برای ما بسازد.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

چرا در
arraylist
نیاز به تبدیل نوع داده
(casting)
داریم اما در
List<>
این نیاز را نداریم؟

A

arraylist
مجموعه ای از اشیا است که هر نوع داده ای می تواند باشد زیرا نوع آن
object
است.
وقتی یک شی را از
arraylist
میخوانیم، آن شی به عنوان
object
بازگشت داده می شود.
برای اینکه به متودها و ویژگی های آن شی خودمان دسترسی داشته باشیم، باید این
object
را به شی خودمان تبدیل
(casting)
کنیم.
اما
List<>
مجموعه ای از اشیا با نوع داده ی مشخص است.
مثلا
List<Product>
این لیست بالا فقط اشیایی از جنس
Product
می تواند داشته باشد.</Product>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

در c#
بهترین متود برای مرتب کردن آیتم ها کدام است؟

A

OrderBy(p=>p.Name)

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

برای
nullable
کردن یک متغیر در کلاس چگونه عمل می کنیم؟

A

در
Constructor
به شکل زیر می نویسیم:
public Product (string name, decimal? price = null)
{
this.name = name;
this.price = price;
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

انواع تایپ ها در
generic
را بگویید و مثالی از کد آن بزنید.

A

Open Type:
نوع پارامتر مشخص نمی شود.
Closed Type:
نوع پارامتر مشخص می شود.
این نوع بهتر است زیرا در زمان اجرا شدن کد، خطاها زودتر و دقیق تر مشخص می شوند.
کلاس جنریک
Dictionary:

Dictionary<string, int> wordCount = new Dictionary<string, int>();
wordCount[“Hello”] = 1;
wordCount[“World”] = 2;

foreach (var word in wordCount)
{
Console.WriteLine($”{word.Key}: {word.Value}”);
}

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Guid
در دات نت چیست؟

A

Guid
Globally Unique Identifier
یک نوع داده خاص در دات نت است که برای شناسایی منحصر به فرد اشیا در سیستم ها و دیتابیس ها به کار می رود.
مانند
ID
عمل می کند.
یک
Guid
معمولاً به صورت یک رشته متنی با فرمت خاص نمایش داده می‌شود که شامل 32 رقم هگزادسیمال و 4 خط تیره است.
public class User
{
public Guid Id { get; set; }
public string Name { get; set; }

public User (string Name)
{
    Id = Guid.NewGuid();
    this.Name = Name;

}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

تابع
ConvertAll()
چه نوع تابعی است و توضیح دهید.

A

تابع
ConvertAll()
یک تابع جنریک است.
و این امکان را می دهد که یک
List<T>
لیست از نوع
T
را به لیست دیگری از نوع
TOutput
List<TOutput>
تبدیل کنیم.
List<string> numbers = new List<string> {"1", "2", "3"};
List<int> newNumbers = numbers.ConvertAll<int>(x=> int.Parse(x));
foreach (var number in newNumbers)
{
Console.WriteLine(number);
}</int></int></string></string></TOutput></T>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

تفاوت
Refrence Type
و
Value Type
را بنویسید

A

Refrence Type
(نوع مرجع)
به اشیا
(object)
اشاره دارد و در حافظه به صورت
refrence
ذخیره می شود.
Value Type
مستقیم به خود داده اشاره دارد.
مثل
float, int, struct

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

Generic Types

Refrence Type Constraint
چیست؟

A

محدودیت نوع مرجع یا
Refrence Type Constraint
این امکان را می دهد که فقط و فقط از مرجع
(class)
به عنوان نوع پارامتر می توان استفاده کرد و مثلا نمی توان از
float, int, struct , …
به عنوان نوع پارامتر استفاده کرد.
public class Repository<T> where T : class
{
private List<T> items = new List<T>();</T></T></T>

public void AddItem(T item)
{
    items.Add(item);
}

public T GetItem(int iindex)
{
    return items[iindex];
} }
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Generic Types

Value Type Constraint
چیست؟

A

محدودیت نوع مقدار یا
Value Type Constraint
این امکان را می دهد که فقط از نوع مقدار باید برای نوع پارامتر استفاده کنیم.
مثل
imt, enum, …
class ValSample<T> where T : struct {
}</T>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Generic Types

Constructor Type Constraint
چیست؟

A

محدودیت نوع سازنده
نعیین می کند، پارامتری که می گیرد باید سازنده یا
constructor
بدون پارامتر داشته باشد.

public class Sample
{
public T CreateInstance<T>() where T : new()
{
return new T();
}
}</T>

public class ExampleClass
{
public string Name { get; set; }

public ExampleClass ()
{
    Name = "Default Name";
} } Sample sample = new Sample(); ExampleClass instance = sample.CreateInstance<ExampleClass>(); Console.WriteLine(instance.Name);
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Generic Types

Conversion Type Constraint
چیست؟

A

محدودیت نوع تبدیل
این امکان را می دهد که
نوع پارامتر انتخابی باید از یک اینترفیس یا یک کلاس مشخص پیروی کند.
public class Comparer<T> where T : IComparable<T>
{
public bool IsGreaterThan(T first, T second)
{
return first.CompareTo(second) > 0;
}
}
int num1 = new int();
int num2 = new int();
num1 = 10;
num2 = 6;
var comparer = new Comparer<int>();</int></T></T>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Generic Types

Type Inference in Generic Methods

A

Type Inference
این امکان را می دهد که در متد جنریک، نوع آرگومان را به طور مستقیم مشخص نکنیم.
بلکه با توجه به آرگومانی که به متد جنریک می دهیم، خود کامپایلر متوجه می شود این متد از چه نوعی است.
static List<T> MakeList<T>(T first, T second)
List<string> list = MakeList<string>("Line 1", "Line 2");
در آبجکت بالا دیگر نیازی نیست به متد
MakeList
نوع آرگومان
string
را پاس دهیم بلکه مثال پایین می گوید چزور کامپایلر تشخیص می دهد که آرگومان از نوع
string
است.
List<string> list = MakeList("Line1", "Line2");</string></string></string></T></T>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

اگر نوع پارامتر بدون محدودیت یعنی
unconstrained
باشد
چگونه می توان آن را مقایسه کرد؟

A

۱. مقایسه با
== و !=
در نوع‌های بدون محدودیت
فقط برای
. null
فقط با
== و !=
می توان آن پارامتر را با
null
مقایسه کرد و نمی توان دو پارامتر از نوع
T
را با
== و !=
مقایسه کرد. چون هیچ تضمینی نیست که این دو پارامتر از نوع یکسان باشند.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

reference comparison

A

مقایسه ی مرجع یا
reference comparison
دو مقدار را با هم مقایسه می کند که آیا هر دو به یک شی یا یک مرجع اشاره می کنند یا خیر.
string str1 = “Hello”;
string str2 = “Hello”;
Console.WriteLine(str1 == str2);
خروجی مقایسه بالا
false
می شود زیرا
مقدار داخل هر دو
“hello”
اما
str1 و str2
دو شیء مستقل هستند،
یعنی به دو آدرس مختلف در حافظه اشاره دارند.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

کلاس جنریک
Tuple (T1, T2)

A

این کلاس دو مقدار از انواع مختلف را ذخیره کند

مثلا
Tuple(string, int)
Tuple(int, string) pair = new Tuple(int, string)(10, “value”);

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
17
Q

arraylist
و
List
را از لحاظ جنریک بودن یا نبودن چگونه مقایسه می کنید؟

A

ArrayList
یک مجموعه غیر جنریک است یعنی مجموعه ای از اشیا
(object)
است که نیاز به
boxing و unboxing
یعنی تبدیل نوع داده،
داریم.
List
یک مجموعه جنریک است که نیاز به
boxing و unboxing
نداریم.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
18
Q

Generics

typeof(genericMethod)

A

این متد
typeof()
یک ورودی جنریک متود می گیرد که نوع جنریک و نوع پارامتر آن جنریک را مشخص می کند.
public class ReflectionExample
{
public static void ShowTypeInfo<x>()
{
Type GenericDefinition = typeof(Dictionary<,>);
Console.WriteLine($"Dictionary<,>: {GenericDefinition}");</x>

    Type constructedtype = typeof(List<x>);
    Console.WriteLine($"List<x>: {constructedtype}");

    Type closedtype = typeof(Dictionary<int,string>);
    Console.WriteLine($"Dictionary<int,string>: {closedtype}");
} } که  x بالا می تواند هر نوع داده ای باشد مثل int, string, list , ...
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
19
Q

GetGenericTypeDefinition()

A

این متود یک ورودی جنریک متود را می گیرد و فقط نوع جنریک متود را مشخص می کند.
GetGenericTypeDefinition(List<int>)
ورودی زیر را می دهد:
System.Collections.Generic.List`1[T]</int>

مثال دیگر:
Type constructedtype = typeof(List<int>);
Type getgenericdefinitiontype = constructedtype.GetGenericTypeDefinition();
Console.WriteLine(getgenericdefinitiontype);
ورودی زیر را می دهد:
System.Collections.Generic.List`1[T]
Console.WriteLine(typeof(List<int>));
ورودی زیر را می دهد:
System.Collections.Generic.List`1[System.Int32]
Console.WriteLine(constructedtype == getgenericdefinitiontype);
ورودی زیر را می دهد:
false</int></int>

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
20
Q

MakeGenericType()

A

یک قالب جنریک اصلی داریم که می خواهیم نوع پارامترهای آن ها را مشخص کنیم و یک متود جنریک
closed type
بسازیم.
Type dictionary = typeof(Dictionary<,>); –قالب جنریک اصلی
Type cosntructedtype = dictionary.MakeGenericType(typeof(string), typeof(int)); –مشخص کردن نوع پارامترهای جنریک
Console.WriteLine(cosntructedtype);

21
Q

هم پوشانی در آرایه ها چه معایبی دارد که لیست ها از هم پوشانی پشتیبانی نمی کنند؟

A

class Animal { }
class Cat : Animal { }
class Turtle : Animal { }

Animal[] animals = new Cat[5];
در کد بالا چون
Cat
زیرکلاسی از
Animal
است،
آرایه ای از
Animal
به آرایه ای از
Cat
اشاره می کند.
اما به این آرایه ی
animals
نمی توان یک زیرکلاس دیگری که از یک نوع دیگری باشد، اضافه کرد، چون این آرایه فقط از آبجکت های
Cat
باید باشد.
مثلا کد پایین خطا می دهد:
animals[0] = new Turtle();
به همین دلیل جنریک ها در زبان سی شارپ از هم پوشانی پشتیبانی نمی کنند تا مانع بروز این خطا شوند.
مانند لیست در کد زیر:
List<Animal> animals = new List<Animal>();</Animal></Animal>

    // اضافه کردن آبجکت‌های Cat به لیست Animal
    animals.Add(new Cat());
    animals.Add(new Cat());

    // دسترسی به اعضای لیست
    foreach (Animal animal in animals)
    {
        animal.Speak();  // خروجی: Meow!
    }
22
Q

Nullable<T></T>

A

دراین نوع جنریک، پارامتر
T
از نوع
value type
است و نمی تواند برای نوع دیگری از پارامتر به کار رود.
در واقع این متد جنریک، یک
value Type
را به نوعی تبدیل می کند که می تواند نال باشد.

Hasvalue –>
چک می کند که متغیر مقدار دارد یا خیر

Nullable<DateTime> date = null; --> یک تاریخ نال پذیر بدون مقدار اولیه</DateTime>

if (!date.HasValue)
{
Console.WriteLine(“The date doesnt set yet.”);
}
date = DateTime.Now;
if (date.HasValue)
{
Console.WriteLine($”now date: {date}”);
}

23
Q

کاربرد
GetValueOrDefault()
برای متغیراز جنس
Nullable<T></T>

A

این متد یا خود
value
را برمی گرداند یا مقدار دیفالتی که به متد می دهیم را بر می گرداند.
static void Display(Nullable<int> x)
{
Console.WriteLine("HasValue: {0}", x.HasValue);
if (x.HasValue)
{
Console.WriteLine("Value: {0}", x.Value);
Console.WriteLine("Explicit conversion: {0}", x);
}
Console.WriteLine($"GetValueOrDefault: {x.GetValueOrDefault()}");
Console.WriteLine($"GetValueOrDefault: {x.GetValueOrDefault(10)}");</int>

}
static void Main(string[] args)
{

Nullable<int> x = new Nullable<int>();
Console.WriteLine("Instance without value:");
Display(x);
24
Q

boxing VS unboxing

A

boxing:
تبدیل مقدار ارزش به آبجکت
int? nullable = 5;
object boxednullable = nullable;

unboxing:
عکس عمل باکسینگ
یعنی تبدیل آبجکت به مقدار ارزش
int normal = int(boxednullable );

25
کاربرد عملگر Null Coalescing (??) در سی شارپ چیست؟
دو تا مقدار را با هم مقایسه می کند و درصورت نال بودن مقدار اول، مقدار دوم را بر می گرداند int? a = 5; int b = 10; int c = a ?? b; c --> 5;
26
Threadstart کاربردش چیست؟
Threadstart یک نوع delegate است که برای اشاره کردن به متودهای بدون پارامتر و بدون برگرداندن چیزی به کار می روند. Delegate mydelegate = Threadstart(Mymethod)
27
کوواریانس را تعریف کنید و مثال بزنید. Covariance
کوواریانس این اجازه را به ما می دهد که یک جنریک از نوع مشتق شده را به یک جنریک از نوع پایه تبدیل کنیم به شرطی که جنریک فقط خواندنی باشد یعنی اگر Cat از Animal به ارث ببرد: یک نوع جنریک با نوع مشتق‌شده IEnumerable را به IEnumerable می توانیم منتقل کنیم IEnumerable cats = new List; IEnumerable animals = cats; یه به عبارتی در کوواریانس، جنریک خاص تر به جنریک عمومی تر تبدیل می شود
28
کنتراواریانس را تعریف کنید و مثال بزنید. Contravariance
کنتراواریانس این اجازه را به ما می دهد که یک جنریک از نوع پایه را به یک جنریک از نوع مشتق شده منتقل کنیم. به شرطی که جنریک write-only باشد یعنی اگر Cat از Animal به ارث ببرد: یک جنریک از نوع پایه IComparer را به IComparer می توانیم منتقل کنیم در واقع وقتی IComparer دو تا Animal را با هم مقایسه می کند، دوتا Cat را هم می تواند با هم مقایسه کند IComparer AnimalComparer = new AnimalComparer(); IComparer CatComparer = AnimalComparer; یا به عبارتی در کنتراواریانس، یک جنریک عمومی تر به خاص تر تبدیل می شود
29
چه زمانی یک تابع را به صورت delegate می نویسیم؟
1- زمانی که تابع بدون نام بخواهیم تعریف کنیم 2- بخواهیم آن تابع را به عنوان یک پارامتر به متودهای دیگر بدهیم 3- یک تابع منعطف بخواهیم بنویسیم مثال: Action printreverse = delegate (string text) { char[] chars = text.ToCharArray(); Array.Reverse(chars); Console.WriteLine(new string(chars)); }; printreverse("Hello");
30
Iterators چیست و چه کاربردی دارد؟
با iterator می توان به همه ی عناصر یک دنباله از آیتم ها دسترسی پیدا کرد، بدون اینکه نگران نوع دنباله باشیم که آرایه، لیست، لیست پیوندی و ... است. iterator به‌جای بازگرداندن یکباره کل داده‌ها، هر بار یکی از عناصر را به ترتیب بازمی‌گرداند. public class IterationSample : IEnumerable { object[] values; int startingpoint; public IterationSample (object[] values, int startingpoint) { this.values = values; this.startingpoint = startingpoint; } public IEnumerator GetEnumerator() { for (int index = 0; index < values.Length; index++) { yield return values[index]; } } } object[] values = { "A", "b", "c", "d", "e" }; IterationSample iterator = new IterationSample(values, 2); foreach (object value in values) { Console.WriteLine(value); }
31
استفاده از GetEnumerator() در iterator
در ایتدا یک متد به اسم CreateEnumerable() تعریف می کنیم: static IEnumerable CreateEnumerable() { Console.WriteLine("{0}Start of CreateEnumerable()"); for (int i = 0; i < 3; i++) { yield return i; } } IEnumerable iterable = CreateEnumerable(); IEnumerator iterator = iterable.GetEnumerator(); while (iterator.MoveNext()) { Console.WriteLine(iterator.Current); }
32
IEnumerable<> چیست و چه کاربردی دارد؟
یک اینترفیس است که یک مجموعه قابل پیمایش (iterable) را می سازد. تنها متد این اینترفیس، متد GetEnumerator() است. public IEnumerator GetEnumerator();
33
IEnumerator<> چیست و چه کاربردی دارد؟
یک اینترفیس است که در یک مجموعه پیمایش می کند و به صورت گام به گام به عناصرآن مجموعه دسترسی دارد. یک متد رایج آن، متد MoveNext() است که برای حرکت به عنصر بعدی استفاده می شود. وقتی به انتهای مجموعه برسد، این متد false را بر می گرداند. Current: این پراپرتی آخرین عنصر بازگشتی از MoveNext را برمی‌گرداند.
34
کاربردهای رایج iterator
1- کار با big Data مثل خواندن خط به خط یک فایل 2- فیلتر کردن داده ها یا تبدیل داده ها در یک لیست با عملیات های lazy (پردازش تدریجی داده ها) 3- انجام چند درخواست شبکه به صورت موازی و سپس ترکیب نتایج آنها.
35
static class
برای استفاده از کلاس استاتیک نیازی به ایجاد نمونه نیست، و مستقیم می توانیم از متدهای این کلاس استفاده کنیم. public static class MathHelper { public static int Add(int a, int b) { return a + b; } public static int Subtract(int a, int b) { return a - b; } public static int Multiply(int a, int b) { return a * b; } public static double Divide(double a, double b) { if (b == 0) { throw new DivideByZeroException("Can not devide by zero!"); } return a / b; } }
36
دسترسی جداگانه به getter و setter در ویژگی‌ها (Properties)
این امکان دسترسی جداگانه به getter و setter در سی شارپ وجود دارد زیرا مثلا می خواهیم یک پراپرتی در همان کلاس فقط مقدار دهی شود اما خارج از کلاس بتوان این ویژگی را خواند. بنابراین باید private set و public get برای این ویژگی در کلاس ست کنیم public string Name { get { return Name; } private set { Name = value; } }
37
implicit typing تایپ ضمنی در سی شارپ
استفاده از تایپ ضمنی در سی شارپ با استفاده از var باعث می شود از تکرار نوع طولانی مانند ایجاد یک متغیر از جنریک ها جلوگیری شود var dict = new Dictionary(); در مثال بالا نیازی به تکرار Dictionary نیست و به جای آن از var استفاده کردیم
38
مهم ترین کاربرد Anonymous Types چیست؟
بدون اینکه نمونه ای از یک کلاس دیگر بسازیم، می توانیم یک شی با خصوصیاتی که می خواهیم ایجاد کنیم. var tom = new {Name="Tom", Age= 20};
39
درخت بیان چیست؟ Expression Trees
یک درخت بیان مجموعه‌ای از گره‌ها (Nodes) است که هر گره یک بیان (Expression) را نشان می‌دهد. گره‌های برگ: مقادیر ثابت (مثل 2 یا 3) گره‌های والد: عملیاتی مثل جمع، تفریق، فراخوانی متد و ... که گره‌های برگ را ترکیب می‌کنند. 3 +2 درخت بیان همیشه از پایین به بالا ساخته می شود نمونه ای از کد درخت بیان و تبدیل آن به دلگیت و اجرا کردن آن: Expression firstArg = Expression.Constant(4); Expression secondArg = Expression.Constant(5); Expression add = Expression.Add(firstArg, secondArg); Console.WriteLine(add.ToString()); var compile = Expression.Lambda>(add).Compile(); Console.WriteLine($"result: " + compile());
40
Type Inference استنباط نوع
بدون اینکه نیاز باشد شما در سی شارپ، نوع پارامتر را مشخص کنید، فقط کافی است پارامتر را به متود بدهیم و خود کامپایلر تشخیص می دهد که این پارامتر از چه نوعی است مثالی از استنباط سه مرحله ای را در کد زیر می بینیم: static void PerformTwoConversions( TInput input, Converter firstConversion, Converter secondConversion ) { Tmiddle middle = firstConversion(input); TOutput output = secondConversion(middle); Console.WriteLine(output); PerformTwoConversions( "Another string", text => text.Length, length => Math.Sqrt(length) ); }
41
Extension Method روش های گسترش
Extension Method در یک کلاس استاتیک نوشته می شود و اول پارامتر این متود با this شروع می شود. نمونه هایی از Extension Method در Enumerable داریم: Where, Select, OrderBy var collection = list.Select(x=>x.value > 10); متود های گسترش، خوانایی کد را بالا می برند.
42
Select syntax in c#
var query = SampleData.AllUsers.Select(user => user);
43
Multiple where syntax in c#
SampleData.AllDefects .Where(defect => defect.Status != Status.Closed) .Where(defect => defect.AssignedTo == tim) .Select(defect => defect.Summary);
44
Sorting in c# with OrderBy, ThenBy
در Linq در سی شارپ، مرتب سازی اصلی لیست با OrderBy انجام می شود و مرتب سازی ثانویه لیست با ThenBy انجام می شود. مثلا در کد زیر، اگر اسم های کاربران یکسان بود، بر اساس سن آن ها مرتب سازی می کند. var sorted = people .OrderBy(person => person.LastName) // مرتب‌سازی اولیه بر اساس نام خانوادگی .ThenBy(person => person.Age); // مرتب‌سازی ثانویه بر اساس سن
45
Group joins with join ... into clauses
سینتکس group join به شکل زیر است که در واقع کار right join را انجام می دهد و به ازای هر رکورد از جدول اول، یک نتیجه بر می گرداند. var query = from defect in SampleData.AllDefects join subscription in SampleData.AllSubscriptions on defect.Project equals subscription.Project into groupedSubscriptions select new { Defect = defect, Subscriptions = groupedSubscriptions }; foreach (var entry in query) { Console.WriteLine(entry.Defect.Summary); foreach (var subscription in entry.Subscriptions) { Console.WriteLine(" {0}", subscription.EmailAddress); } }
46
Group By syntax in C#
SampleData.AllDefects.Where(defect => defect.AssignedTo != null) .GroupBy(defect => defect.AssignedTo, defect => defect.Summary)
47
استفاده از Task<> و async , await در متود های سی شارپ برای چیست؟
وقتی یک ریکوئست به سرور از طریق این متود از جنس Task<> ارسال می کنیم و سرور در حال لود دیتای ما هست، سرور مسدود نشود و ریکوئست های دیگر هم بتوانند به سرور ارسال شوند. public async Task>> GetMissions() { var missions = await _context.Missions.ToListAsync(); // عملیات غیرهمزمان برای خواندن داده‌ها از پایگاه داده return Ok(missions); // بازگشت پاسخ موفقیت‌آمیز با داده‌ها }
48
استفاده از ActionResult در متودهای سی شارپ برای چیست؟
برای اینکه status های مختلف HTTP Methods رو بر گردونیم. مثل 200 ok 404 Not Found
49
ارسال اطلاعات از کنترلر به ویو چگونه انجام می شود؟
برای ارسال اطلاعات از کنترلر به ویو دو تا راه داریم: 1- ViewBag var person = createperson(); @ViewBag.person = person; 2- ViewData @ViewData["address"] = "solaleh.com"