Нет, Вы не должны объявлять общедоступного конструктора; частные конструкторы пакета будут так же применимы. Классы вне пакета не были бы в состоянии использовать конструктора так или иначе, так как они не видят класс.
Квалификатор глобального пространства имен позволяет вам получить доступ к члену в глобальном («пустом») пространстве имен.
Если вы вызываете неквалифицированный тип (например, MyClass.DoSomething (), а не MyNamespace.MyClass.DoSomething ()), то предполагается, что он находится в текущем пространстве имен. Как тогда вы квалифицируете тип, чтобы сказать, что он находится в глобальном / пустом пространстве имен?
Этот пример кода (консольное приложение) должен иллюстрировать его поведение:
using System;
namespace MyNamespace
{
public class Program
{
static void Main(string[] args)
{
MessageWriter.Write(); // writes "MyNamespace namespace"
global::MessageWriter.Write(); // writes "Global namespace"
Console.ReadLine();
}
}
// This class is in the namespace "MyNamespace"
public class MessageWriter
{
public static void Write()
{
Console.WriteLine("MyNamespace namespace");
}
}
}
// This class is in the global namespace (i.e. no specified namespace)
public class MessageWriter
{
public static void Write()
{
Console.WriteLine("Global namespace");
}
}
Префикс указывает на глобальное пространство имен. Вот пример:
namespace Bar {
class Gnat { }
}
namespace Foo {
namespace Bar {
class Gnat { }
}
class Gnus {
Bar.Gnat a; // Foo.Bar.Gnat
global::Bar.Gnat b; // Bar.Gnat
}
}
Обратите внимание на то, что член a, возможно, случайно ссылается на класс Foo.Bar.Gnat. Чтобы избежать этого, используйте префикс global ::.
Квалификатор global :: namespace используется в автоматически созданном для предотвращения коллизии при разрешении типов через вложенные пространства имен.
From here
When the left identifier is global, the search for the right identifier начинается с глобального пространства имен.