Short answer : ( it depends on your needs). i'll explain.
- it depends if your title should change at runtime.
Long answer :
Here is my observation(with a small test) :
I set title
at the Page directive
:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="Exampales_test" Title="ppppppppp" %>
I also set via html
:
<head runat="server" ID="hhh">
...
<title runat="server">fffffffff</title>
</head>
I have this test code :
protected override void OnPreInit(EventArgs e)
{
// <----- breakpoint here (A)
base.OnPreInit(e);
// <----- breakpoint here (B)
}
protected void Page_Load(object sender, EventArgs e)
{ // <----- breakpoint here (C)
this.Title = "cccccccc";
}
Visual :

Now let's see :
When I press Run
:
The Page does have the html title value (ffffff
)

Also at the end of PreInit

Investigating the OnInit
shows it has already changed (in the way {if you want to know exactly in what stage - this can be done}) to ppppppppp

And of course the last event ( among what we've talked about) is the page_load
: which does change the value :

And the value is :

So which to choose ?
If your code is changing the Title
dynamically (I mean at runtime), don't use the html markup at all nor the page directive.
e.g. if your code is (for example) has ASCX and that ACSX should change the title , then just use code ( not directive nor html markup).
As you noticed already - the value which wins is The one who occurs last(timeline)
It starts with the html markup value , but then the server side code begins to activate and changes values.