Как сказал Грег Хьюгилл, typedef означает, что вам больше не нужно писать struct
повсюду. Это не только экономит нажатия клавиш, но и может сделать код чище, так как он обеспечивает smidgen больше абстракции.
Такие вещи, как
typedef struct {
int x, y;
} Point;
Point point_new(int x, int y)
{
Point a;
a.x = x;
a.y = y;
return a;
}
становятся чище, когда вам не нужно видеть ключевое слово «struct» повсюду, это выглядит так, как будто на самом деле есть тип с именем «Point» в вашем язык. Который, после typedef
, случай, я думаю.
Также обратите внимание, что, хотя ваш пример (и мой) опускает наименование самого struct
, собственно именование также полезно, когда вы хотите предоставить непрозрачный тип. Тогда у вас будет такой код в заголовке, например:
typedef struct Point Point;
Point * point_new(int x, int y);
, а затем укажите определение struct
в файле реализации:
struct Point
{
int x, y;
};
Point * point_new(int x, int y)
{
Point *p;
if((p = malloc(sizeof *p)) != NULL)
{
p->x = x;
p->y = y;
}
return p;
}
В этом последнем случае Вы не можете вернуть Point по значению, так как его определение скрыто от пользователей заголовочного файла. Этот метод широко используется, например, в GTK + .
ОБНОВЛЕНИЕ Обратите внимание, что существуют также высоко ценимые C-проекты, где использование typedef
для сокрытия struct
считается плохой идеей, ядро Linux, вероятно, является наиболее известным таким проектом , См. Главу 5 из документа Linux Kernel CodingStyle для гневных слов Линуса. :) Моя точка зрения заключается в том, что слово «должен» в этом вопросе, возможно, не заложено в камень.
Я видел на разных сайтах много шума по этому поводу ...
Чтобы отфильтровать последний, являющийся сеткой данных, используя источник данных в качестве источника, что довольно часто делается для кода ниже:
DataTable dt = new DataTable("Table1");
//fill your datatable...
//after fill...
dataGrid1.DataContext = dt;
IBindingListView blv = dt.DefaultView;
blv.Filter = "NAME = 'MOISES'";
Я написал свой собственный элемент управления FilterDataGrid, он гораздо более гибкий, чем те, что представлены в CodeProject или где-либо еще. Я не могу ни опубликовать здесь полный код, ни опубликовать его.
Но: поскольку ваш источник данных, скорее всего, заключен в ICollectionView, вы можете сделать что-то вроде этого:
public void ApplyFilters()
{
ICollectionView view = CollectionViewSource.GetDefaultView(ItemsSource);
if (view != null)
{
view.Filter = FilterPredicate;
}
}
private bool FilterPredicate(object item)
{
var yourBoundItemOrRow = item as BoundItemType;
return aFilterObject.Matches(yourBoundItemOrRow);
}
Вы можете легко реализовать любую логику фильтра на основе этой концепции. Даже очень, очень мощные фильтры. Примечание: у меня есть эти методы в моем собственном классе, полученные из сетки данных. Они также могут быть адаптированы для работы вне сетки, например, в UserControl