В новой студии, по умолчанию, при создании веб-приложения на master page добавляется ещё один ContentPlaceHolder:


<head runat="server">
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>


Таким образом на любой странице можно легко добавить теги title, meta, link.
Также, по умолчанию, у страницы задан атрибут Title="Untitled Page", из-за чего при использовании <title>My page</title> заголовок страницы не меняется, а исходных html-код получается таким:

<title> Untitled Page </title> <title>My page</title>

Приоритет, у способов установки названия странице, оказался таким (от большего к меньшему):

  • Явно присвоить в коде свойству Title страницы название:
    Title = “My page”;

  • Указать атрибут страице:
    <%@ Page Language="C#" MasterPageFile="~/MyMaster.Master" AutoEventWireup="true" CodeBehind="MyPage.aspx.cs" Inherits="MySite.Pages" Title="My Page" %>

  • Установить тег title:

    <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
    <title>My Page

Приведение типов на практике встречается довольно часто. Из-за того, что в языке C# существует два оператора, позволяющих решить эту задачу, время от времени возникают InvalidCastException. Остановимся на этих операторах подробнее.

1. () оператор. На уровне IL-кода генерирует вызов функции castclass Выдержка из msdn: A cast explicitly invokes the conversion operator from one type to another; the cast fails if no such conversion operator is defined.
Оператор можно использовать только в том случае, если это предусмотрел разработчик.
Плюсы: простота в использовании, читабельность кода. Работает как с value, так и с reference типами.
Минусы: можно использовать не со всеми типами данных; источник InvalidCastException в случае неудачного вызова.


int? i1 = 2;
// вычисление значения i2
int i2 = (int)i1; // к этому моменту возможна ситуация, когда i1 будет равным null.


Еще один не менее распространённый пример:

public void MyMethod(object intObj)
{
if (intObj != null)
{
int intO = (int) intObj;
// ...
}
}

Такой код, как правило, используется когда порграммист уверен в том, что прийдёт нужный ему тип. Но, в случае использование сторонних библиотек или чужого кода вероятность такого поведения достаточно низкая.
2. Оператор as. На уровне IL-кода генерирует вызов функции isinst, в случае успешного выполнения которой происходит приведение типа. В противном случае – объекту присваивается null. Выдержка из msdn: The as operator is like a cast operation. However, if the conversion is not possible, as returns null instead of raising an exception.
Оператор работает со всеми reference-типами и выдаёт ошибку при компиляции в случае приминения к value-типу.
Плюсы: Работает с большинством типов данных. В случае неккоректного вызова не генерирет исключения. Не зависит от реализации класса.
Минусы: Не работает с vlue-типами. После вызова оператора желательна проверка на null:
string s = someObject as string;
if (s != null)
{
// someObject is a string.
}