2013-04-05 2 views
1

Как легко клонировать (копировать) a RectangleF в C#?Как клонировать RectangleF

Есть, очевидно, неэлегантные способы сделать это, например new RectangleF(r.Location, r.size), но, конечно, есть методили .Clone где-то скрывается? Но ни один из этих компиляторов для меня не существует и не является конструктором копирования. Я подозреваю, что есть простой, C# -стандартный способ копирования любой структуры, которую я еще не нашел.

В случае, если это имеет значение, моя настоящая цель - создать метод, который возвращает смещенную версию прямоугольника (потому что, как ни удивительно, RectangleF не имеет такого встроенного - он имеет только метод мутатора). Мой лучший удар в это:

public static RectangleF Offset(RectangleF r, PointF offset) { 
    PointF oldLoc = r.Location; 
    return new RectangleF(new PointF(oldLoc.X+offset.X, oldLoc.Y+offset.Y), r.Size); 
} 

(Сделан уродливее, чем это должно быть на поразительное отсутствие оператора сложения для PointF, но это другой вопрос.) Есть ли более простой способ сделать это?

ответ

4

RectangleF - это структура, то есть тип значения. Рассмотрим следующий пример:

public class Program 
{ 
    struct S 
    { 
     public int i; 
    } 

    static void Main(string[] args) 
    { 
     S s1 = new S(); 
     S s2 = s1; 

     s1.i = 5; 

     Console.WriteLine(s1.i); 
     Console.WriteLine(s2.i); 
    } 
} 

Выход:

5 
0 

Поскольку S является структурой, т.е. s2 является копией s1.

+1

Спасибо (и спасибо @ jdv-Jan de Vaan, тоже). Я знал, что я должен упустить что-то очевидное! Использование «нового» оператора заставил меня думать, что я работаю со ссылками, но теперь вижу, что это не так на C#. –

3

A Rect - это структура, тип значения.

Чтобы клонировать его, просто назначьте его новой переменной.