PDA

View Full Version : سوال: معنی این علامت <> کنار اسم بعضی از توابع ؟



odiseh
شنبه 21 مرداد 1396, 00:24 صبح
سلام دوستان
وقتتون بخیر
جناب مایکروسافت منظورش از علامتهای <> کنار اسم یه سری از توابع سی شارپ چیه؟ تعدادشون هم اینروزا کم نیست!!
مثلا <> select
<> orderby
و ....
بعد جالبه موقع استفاده از اینا باید پرانتز بکار ببریم!

RIG000
شنبه 21 مرداد 1396, 01:42 صبح
اینها Type رو مشخص میکنند. مربوط به Generic هاست (در مورد جنریک ها باید بخونی و فقط با توضیح ساده نمیشه همه چی دستت بیاد.) شما این امکان رو دارید که جنریک ایجاد کنید و همچنین از کلاس و متد های داخلی خود مایکروسافت استفاده کنید.به طور مثال
. شما به این طریق در زمان کامپایل نوع رو مشخص میکنید.


class Book
{
public int Id { get; set; }
public string BookName { get; set; }
}




public void ExampleMethod()
{
List<Book> bookType = new List<Book>();
var res = bookType.Select(s => s.BookName == "F#" && s.Id == 1);
}

odiseh
شنبه 21 مرداد 1396, 10:08 صبح
ممنونم از شما
من با generics آشنایی دارم و بکار می برم توی برنامه هام ولی آخه ما که داخل این توابع, داریم lambda expression می نویسیم و نه تایپ....
مثال خود شما هم در داخل پرانتز از lambda expression استفاده کردید. این چجور تایپی هست؟

RIG000
شنبه 21 مرداد 1396, 12:25 عصر
مشکلت با Generic نیست پس. تو با Experssion ها اشنایی نداری.
در ضمن در مورد Func و Action و Predicate بخون.
یه نمونه کد برات نوشتم کمی دستت بیاد که خودم میدونی همچین متدی رو بنویسی.
در نهایت این دستورات لامبدا در متد های لینک به وفور هستن. اما در کل تو هم میتونی متدهایی رو پیاده سازی کنی از این قبیل رو ....


using System;using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;


namespace Gneric
{
class Book
{
public int Id { get; set; }
public string BookName { get; set; }
public bool IsActive { get; set; }
}
interface ITestInterface<T>
{
IList<Book> Search(Func<T, bool> predicate);
}


class Program : ITestInterface<Book>
{
static IList<Book> lstBook = new List<Book>();


static void Main(string[] args)
{
lstBook.Add(new Book { Id = 1, BookName = "C#", IsActive = true });
lstBook.Add(new Book { Id = 2, BookName = "F#", IsActive = true });
lstBook.Add(new Book { Id = 3, BookName = "Ruby", IsActive = false });


Program p = new Program();
var objOut = p.Search(s => s.IsActive == true);
}


public IList<Book> Search(Func<Book, bool> predicate)
{


var lst = lstBook.ToList();
return lst.Where(predicate).ToList();


}




}


}

FastCode
شنبه 21 مرداد 1396, 22:30 عصر
کامپایلر سعی میکنه type رو حدث بزنه و فقط اگر نتونه شما رو مجبور میکنه اون رو مشخص کنید.
توابع نیز میتوانند مانند کلاسها جنریک باشند و لزوما نباید همان type کلاس معرفشان را استفاده کنند.

class myclass<T1>
{
public static void Main (string [] args)
{
myclass<int> myints = new myclass<int> ();
myints.permute (new int [] { 3, -6, 9 }, new string [] { "a", "c", "r", "p" });
}
public void permute<T2> (IEnumerable<T1> t1s, IEnumerable<T2> t2s)
{
int index = 0;
foreach (var t1 in t1s) {
foreach (var t2 in t2s) {
Console.WriteLine ("{0} T1:{1} T2:{2}", index++, t1, t2);
}
}
}
}




$ mono ./test.exe
0 T1:3 T2:a
1 T1:3 T2:c
2 T1:3 T2:r
3 T1:3 T2:p
4 T1:-6 T2:a
5 T1:-6 T2:c
6 T1:-6 T2:r
7 T1:-6 T2:p
8 T1:9 T2:a
9 T1:9 T2:c
10 T1:9 T2:r
11 T1:9 T2:p