Scripting: Do's and Don'ts – Arma Reforger

From Bohemia Interactive Community
Jump to navigation Jump to search
m (Text replacement - "<syntaxhighlight lang="c#">" to "<enforce>")
m (Text replacement - "</syntaxhighlight>" to "</enforce>")
Line 16: Line 16:
}
}
}
}
</syntaxhighlight>
</enforce>
|
|
<enforce>
<enforce>
Line 35: Line 35:
}
}
}
}
</syntaxhighlight>
</enforce>
|}
|}


Line 56: Line 56:
}
}
}
}
</syntaxhighlight>
</enforce>
|
|
<enforce>
<enforce>
Line 70: Line 70:
}
}
}
}
</syntaxhighlight>
</enforce>
|}
|}


Line 90: Line 90:
// as there are no references to it
// as there are no references to it
}
}
</syntaxhighlight>
</enforce>
|
|
<enforce>
<enforce>
Line 102: Line 102:
// classArray keeps a strong reference to newInstance - it will not be cleared
// classArray keeps a strong reference to newInstance - it will not be cleared
}
}
</syntaxhighlight>
</enforce>
|}
|}


Line 136: Line 136:
}
}
}
}
</syntaxhighlight>
</enforce>
| {{Feature|informative|Here, the MainClass needs the SubClass (it creates it in its constructor meaning it needs it to work) but the subClass does not require MainClass - if the MainClass reference doesn't exist, it will simply not use it.}}
| {{Feature|informative|Here, the MainClass needs the SubClass (it creates it in its constructor meaning it needs it to work) but the subClass does not require MainClass - if the MainClass reference doesn't exist, it will simply not use it.}}
<enforce>
<enforce>
Line 167: Line 167:
}
}
}
}
</syntaxhighlight>
</enforce>
|}
|}


Line 182: Line 182:
<enforce>
<enforce>


</syntaxhighlight>
</enforce>
|
|
<enforce>
<enforce>


</syntaxhighlight>
</enforce>
|}
|}
-->
-->

Revision as of 19:18, 30 July 2022

Don't Do

class ExampleClass { int LProcLgh; int stringlength( string Value ){ LProcLgh= Value.Length(); Print ( "String length obtained: "+LProcLgh ); return LProcLgh; } }

class ExampleClass { protected int m_iLastProcessedLength; int GetStringLength(string value) { m_iLastProcessedLength = value.Length(); Print("String length obtained: " + m_iLastProcessedLength); return m_iLastProcessedLength; } int GetLastProcessedLength() { return m_iLastProcessedLength; } }

Keep variables as close as possible to their usage:

Don't Do

class ExampleClass { protected int m_iLength; int GetStringLength(string name) { m_iLength = name.Length(); Print("String length obtained: " + m_iLength); return m_iLength; } }

class ExampleClass { // keeping the variable into method scope and away from the instance int GetStringLength(string name) { int length = name.Length(); Print("String length obtained: " + length); return length; } }

Keep a strong reference (ref keyword) to required objects:

Don't Do

// this array only lists pointers but does not increase the reference count array<ExampleClass> classArray = new array<ExampleClass>(); for (int i = 0; i < 10; i++) { ExampleClass newInstance = new ExampleClass(); classArray.Insert(newInstance); // newInstance will be deleted at the end of the scope // as there are no references to it }

// this array keeps strong references to its items array<ref ExampleClass> classArray = new array<ref ExampleClass>(); for (int i = 0; i < 10; i++) { ExampleClass newInstance = new ExampleClass(); classArray.Insert(newInstance); // classArray keeps a strong reference to newInstance - it will not be cleared }

Avoid strong reference cyclic trap:

Don't Do
Here, both ParentClass and ChildClass have a strong reference to each other, keeping the reference count above zero - creating an "island of isolation" (see Arma Reforger:Scripting: Automatic Reference Counting for more information).

class MainClass { ref SubClass m_subClass; void MainClass() { m_subClass = new SubClass(this); } } class SubClass { ref MainClass m_parent; void SubClass(MainClass parent) { m_parent = parent; } void DoSomething() { Print(m_parent); } }

Here, the MainClass needs the SubClass (it creates it in its constructor meaning it needs it to work) but the subClass does not require MainClass - if the MainClass reference doesn't exist, it will simply not use it.

class MainClass { ref SubClass m_subClass; void MainClass() { m_subClass = new SubClass(this); } } class SubClass { MainClass m_parent; // ref removed void SubClass(MainClass parent) { m_parent = parent; } void DoSomething() { if (!m_parent) // null safety check { return; } Print(m_parent); } }