Это то, что контролируется вашим терминалом, а не printf
.
printf
просто отправляет \t
в выходной поток (который может быть tty, файл и т. Д.), Он не отправляет несколько пробелов.
Анонимные типы предназначены для использования только в очень узких областях. Большинство вариантов использования, которые у меня были, связаны с Linq.
var result = from x in MyCollection
select new
{
x.Prop1,
x.Prop2
};
Кроме того, в случае Linq to SQL - использование анонимных типов будет генерировать другой SQL, выбирая только столбцы, которые используются в анонимном типе. В приведенном выше случае (если бы это был запрос Linq to SQL) он генерировал бы что-то вроде «select prop1, prop2 from mytable» вместо выбора всех полей.
Я никогда (пока) не сталкивался с такой ситуацией. где я хотел просто объявить новый анонимный тип в своем коде. Я полагаю, что если что-то еще, может быть, это было бы хорошим использованием для локальных констант?
var x = new
{
FirstName = "Scott",
LastName = "Ivey"
};
Однако это не останавливает, например, команду ASP.NET MVC, которую вы используете как объект параметра в стиле Hashtable ...
Url.Action(new{controller="Home", action="Index"})
Что я бы не стал поощрять, потому что интенсивного использования магических строк.
Я почти исключительно использую анонимные типы в LINQ-операторах, где в том же методе вы перебираете набор результатов. В значительной степени именно поэтому они были представлены
Один случай, который я обнаружил анонимным Полезный тип - это сериализация объектов в JSon и их возврат в действиях ASP.NET MVC. Вам не обязательно возвращать все свойства объекта, и анонимный тип может вам в этом помочь ..
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Person(int id)
{
Person person = manager.GetPersonById(id);
if(Request.IsAjaxRequest())
return Json(new {Name=person.Name, Age=person.Age,...});
else
...
}
Они полезны в любое время, когда вы хотите выполнить запрос над некоторыми объектами, а затем выполнить над ними другие операции (например, итерацию).
Например:
var procs = System.Diagnostics.Process.GetProcesses().Select(p => new { p.Id, p.ProcessName});
foreach(var p in procs)
{
Console.WriteLine("{0}: {1}", p.Id, p.ProcessName);
}
В последнее время мне очень повезло с ними в удовлетворении полей в DataGrids или DataViews, которые зависят от столбцов из запросов, которые больше не возвращают те же данные. Например, иногда источники данных нормализовались или поля переименовывались по разным причинам. Используя запрос LINQ, возвращающий анонимные типы в качестве «интерфейса», мы можем сохранить существующие сетки в рабочем состоянии.
Правильно; они применимы только в крайне ограниченном объеме.