Здесь будут выкладываться сравнения языков C# и PascalABC.NET с различных точек зрения.
Убедительная просьба не обсуждать здесь выкладываемые примеры. Данное следует делать в отдельной теме.
Здесь будут выкладываться сравнения языков C# и PascalABC.NET с различных точек зрения.
Убедительная просьба не обсуждать здесь выкладываемые примеры. Данное следует делать в отдельной теме.
Объявление на C#:
public T Name { get; set; }
Объявление на PascalABC.NET:
public auto property Name: T;
Возможности, предлагаемые C#:
Возможности, предлагаемые PascalABC.NET:
Рассмотрим предлагаемый функционал подробнее.
namespace CSharpApplicationTest
{
internal class Program<T>
{
public T Name { get; private set; }
private static void Main(string[] args)
{
}
}
}
PascalABC.NET: данной возможности нет, но решить данную проблему можно введением поля с необходимым уровнем доступа.
Пример применения: свойство коллекции Count
(например, в List<T>
), которое возможно читать из вне класса коллекции и менять внутри него.
namespace CSharpApplicationTest
{
internal class Program<T>
{
public T Name { get; set; } = default;
private static void Main(string[] args)
{
}
}
}
type
ClassT<T> = class
public auto property Name: T := default(T);
end;
begin
end.
Пример применения: установка значений свойств по умолчанию и разгрузка кода конструктора как побочный эффект.
using System;
namespace CSharpApplicationTest
{
internal class Program<T>
{
[field: NonSerialized]
public T Name { get; set; }
private static void Main(string[] args)
{
}
}
}
PascalABC.NET: данной возможности нет, но решить данную проблему можно введением поля с необходимым атрибутом.
Пример применения: отмена сериализации специального свойства, такого, например, как SyncRoot
.
Будем рассматривать сравнение на примере самописного типа Point. Обращаю внимание, что каждому операторы следует ставить в соответствие определённый метод, поскольку не каждый .NET язык поддерживает операторы расширения.
Объявление на C#
using System;
namespace CSharpApplicationTest
{
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
public Point(int x, int y)
{
X = x;
Y = y;
}
public override string ToString()
{
return $"{X}, {Y}";
}
}
internal static class Program
{
private static void Main(string[] args)
{
}
}
}
Объявление на PascalABC.NET:
uses System;
type
PointT = record
public auto property X: integer;
public auto property Y: integer;
constructor(x, y: integer);
begin
self.X := x;
self.Y := y;
end;
function ToString(): string; override := $'{X}, {Y}';
end;
begin
end.
Возможности, предлагаемые C#:
Возможности, предлагаемые PascalABC.NET:
Рассмотрим предлагаемый функционал подробнее.
C#:
using System;
namespace CSharpApplicationTest
{
public struct Point
{
public int X { get; set; }
public int Y { get; set; }
public Point(int x, int y)
{
X = x;
Y = y;
}
public override string ToString()
{
return $"{X}, {Y}";
}
}
internal static class Program
{
public static void PrintLine(this Point point)
{
Console.WriteLine(point);
}
private static void Main(string[] args)
{
}
}
}
uses System;
type
PointT = record
public auto property X: integer;
public auto property Y: integer;
constructor(x, y: integer);
begin
self.X := x;
self.Y := y;
end;
function ToString(): string; override := $'{X}, {Y}';
end;
procedure PrintLine(self: PointT); extensionmethod := Writeln(self);
begin
end.
Пример применения: гибкое расширение функциональности встроенных типов без необходимости вносить изменения в исходный код.
C#: на данный момент указанной возможности нет в C#, элегантного решения проблемы не существует для структур, однако для классов можно расширить функциональность базового класса, унаследовавшись от него и определив необходимые операторы.
uses System;
type
PointT = record
public auto property X: integer;
public auto property Y: integer;
constructor(x, y: integer);
begin
self.X := x;
self.Y := y;
end;
function Sum(other: PointT) := new PointT(X + other.X, Y + other.Y);
function ToString(): string; override := $'{X}, {Y}';
end;
procedure PrintLine(self: PointT); extensionmethod := Writeln(self);
function operator+(left, right: PointT); extensionmethod := left.Sum(right);
begin
end.
Пример использования: сокращение записи операций добавления и удаления элементов из коллекций (например, + для массивов из PABCSystem
).